Introduce ABAP Language Version base functionality (#6346)

Co-authored-by: abaplint[bot] <24845621+abaplint[bot]@users.noreply.github.com>
Co-authored-by: Lars Hvam <larshp@hotmail.com>
Co-authored-by: Marc Bernard <59966492+mbtools@users.noreply.github.com>
This commit is contained in:
ThomasPloski 2023-07-23 15:03:46 +02:00 committed by GitHub
parent 83b554f75e
commit e177147f10
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
8 changed files with 333 additions and 119 deletions

View File

@ -351,7 +351,7 @@
"max_one_statement": true,
"message_exists": false,
"method_length": {
"statements": 105,
"statements": 110,
"checkForms": true,
"ignoreTestClasses": false,
"errorWhenEmpty": false

View File

@ -628,6 +628,7 @@ CLASS zcl_abapgit_objects IMPLEMENTATION.
DATA lo_folder_logic TYPE REF TO zcl_abapgit_folder_logic.
DATA lo_i18n_params TYPE REF TO zcl_abapgit_i18n_params.
DATA lo_timer TYPE REF TO zcl_abapgit_timer.
DATA lo_abap_language_vers TYPE REF TO zcl_abapgit_abap_language_vers.
FIELD-SYMBOLS: <ls_result> TYPE zif_abapgit_definitions=>ty_result,
<lv_step_id> TYPE LINE OF zif_abapgit_definitions=>ty_deserialization_step_tt,
@ -684,6 +685,8 @@ CLASS zcl_abapgit_objects IMPLEMENTATION.
ii_log->add_info( |>>> Deserializing { lines( lt_items ) } objects| ).
ENDIF.
CREATE OBJECT lo_abap_language_vers.
lo_folder_logic = zcl_abapgit_folder_logic=>get_instance( ).
LOOP AT lt_results ASSIGNING <ls_result>.
li_progress->show( iv_current = sy-tabix
@ -714,6 +717,9 @@ CLASS zcl_abapgit_objects IMPLEMENTATION.
ENDIF.
ls_item-devclass = lv_package.
ls_item-abap_language_version = lo_abap_language_vers->get_abap_language_vers_by_objt(
iv_object_type = ls_item-obj_type
iv_package = lv_package ).
IF <ls_result>-packmove = abap_true.
" Move object to new package

View File

@ -26,7 +26,7 @@ CLASS zcl_abapgit_dot_abapgit DEFINITION
RETURNING
VALUE(rs_file) TYPE zif_abapgit_git_definitions=>ty_file
RAISING
zcx_abapgit_exception.
zcx_abapgit_exception .
METHODS get_data
RETURNING
VALUE(rs_data) TYPE zif_abapgit_dot_abapgit=>ty_dot_abapgit .
@ -76,9 +76,9 @@ CLASS zcl_abapgit_dot_abapgit DEFINITION
zcx_abapgit_exception .
METHODS use_lxe
IMPORTING
iv_yes TYPE abap_bool DEFAULT abap_undefined
!iv_yes TYPE abap_bool DEFAULT abap_undefined
RETURNING
VALUE(rv_yes) TYPE abap_bool.
VALUE(rv_yes) TYPE abap_bool .
METHODS get_requirements
RETURNING
VALUE(rt_requirements) TYPE zif_abapgit_dot_abapgit=>ty_requirement_tt .
@ -86,22 +86,34 @@ CLASS zcl_abapgit_dot_abapgit DEFINITION
IMPORTING
!it_requirements TYPE zif_abapgit_dot_abapgit=>ty_requirement_tt .
METHODS get_version_constant
RETURNING VALUE(rv_version_constant) TYPE string.
RETURNING
VALUE(rv_version_constant) TYPE string .
METHODS set_version_constant
IMPORTING iv_version_constant TYPE csequence.
IMPORTING
!iv_version_constant TYPE csequence .
METHODS get_abap_language_version
RETURNING
VALUE(rv_abap_language_version) TYPE string .
METHODS set_abap_language_version
IMPORTING
!iv_abap_language_version TYPE string .
PROTECTED SECTION.
PRIVATE SECTION.
DATA: ms_data TYPE zif_abapgit_dot_abapgit=>ty_dot_abapgit.
CLASS-METHODS:
to_xml
IMPORTING is_data TYPE zif_abapgit_dot_abapgit=>ty_dot_abapgit
RETURNING VALUE(rv_xml) TYPE string
RAISING zcx_abapgit_exception,
from_xml
IMPORTING iv_xml TYPE string
RETURNING VALUE(rs_data) TYPE zif_abapgit_dot_abapgit=>ty_dot_abapgit.
DATA ms_data TYPE zif_abapgit_dot_abapgit=>ty_dot_abapgit .
CLASS-METHODS to_xml
IMPORTING
!is_data TYPE zif_abapgit_dot_abapgit=>ty_dot_abapgit
RETURNING
VALUE(rv_xml) TYPE string
RAISING
zcx_abapgit_exception .
CLASS-METHODS from_xml
IMPORTING
!iv_xml TYPE string
RETURNING
VALUE(rs_data) TYPE zif_abapgit_dot_abapgit=>ty_dot_abapgit .
ENDCLASS.
@ -355,4 +367,14 @@ CLASS ZCL_ABAPGIT_DOT_ABAPGIT IMPLEMENTATION.
rv_yes = ms_data-use_lxe.
ENDMETHOD.
METHOD get_abap_language_version.
rv_abap_language_version = ms_data-abap_language_version.
ENDMETHOD.
METHOD set_abap_language_version.
ms_data-abap_language_version = iv_abap_language_version.
ENDMETHOD.
ENDCLASS.

View File

@ -5,48 +5,96 @@ CLASS zcl_abapgit_repo DEFINITION
PUBLIC SECTION.
INTERFACES zif_abapgit_repo.
INTERFACES zif_abapgit_repo .
ALIASES ms_data FOR zif_abapgit_repo~ms_data.
ALIASES:
get_key FOR zif_abapgit_repo~get_key,
get_name FOR zif_abapgit_repo~get_name,
is_offline FOR zif_abapgit_repo~is_offline,
get_package FOR zif_abapgit_repo~get_package,
get_files_local FOR zif_abapgit_repo~get_files_local,
get_files_remote FOR zif_abapgit_repo~get_files_remote,
get_local_settings FOR zif_abapgit_repo~get_local_settings,
refresh FOR zif_abapgit_repo~refresh,
get_dot_abapgit FOR zif_abapgit_repo~get_dot_abapgit,
set_dot_abapgit FOR zif_abapgit_repo~set_dot_abapgit,
deserialize FOR zif_abapgit_repo~deserialize,
deserialize_checks FOR zif_abapgit_repo~deserialize_checks.
METHODS constructor
IMPORTING
!is_data TYPE zif_abapgit_persistence=>ty_repo .
ALIASES ms_data
FOR zif_abapgit_repo~ms_data .
ALIASES deserialize
FOR zif_abapgit_repo~deserialize .
ALIASES deserialize_checks
FOR zif_abapgit_repo~deserialize_checks .
ALIASES get_dot_abapgit
FOR zif_abapgit_repo~get_dot_abapgit .
ALIASES get_files_local
FOR zif_abapgit_repo~get_files_local .
ALIASES get_files_remote
FOR zif_abapgit_repo~get_files_remote .
ALIASES get_key
FOR zif_abapgit_repo~get_key .
ALIASES get_local_settings
FOR zif_abapgit_repo~get_local_settings .
ALIASES get_name
FOR zif_abapgit_repo~get_name .
ALIASES get_package
FOR zif_abapgit_repo~get_package .
ALIASES is_offline
FOR zif_abapgit_repo~is_offline .
ALIASES refresh
FOR zif_abapgit_repo~refresh .
ALIASES set_dot_abapgit
FOR zif_abapgit_repo~set_dot_abapgit .
METHODS bind_listener
IMPORTING
!ii_listener TYPE REF TO zif_abapgit_repo_listener .
METHODS check_and_create_package
IMPORTING
!iv_package TYPE devclass
RAISING
zcx_abapgit_exception .
METHODS constructor
IMPORTING
!is_data TYPE zif_abapgit_persistence=>ty_repo .
METHODS create_new_log
IMPORTING
!iv_title TYPE string OPTIONAL
RETURNING
VALUE(ri_log) TYPE REF TO zif_abapgit_log .
METHODS delete_checks
RETURNING
VALUE(rs_checks) TYPE zif_abapgit_definitions=>ty_delete_checks
RAISING
zcx_abapgit_exception .
METHODS get_dot_apack
RETURNING
VALUE(ro_dot_apack) TYPE REF TO zcl_abapgit_apack_reader .
METHODS get_data_config
RETURNING
VALUE(ri_config) TYPE REF TO zif_abapgit_data_config
RAISING
zcx_abapgit_exception .
METHODS find_remote_dot_abapgit
RETURNING
VALUE(ro_dot) TYPE REF TO zcl_abapgit_dot_abapgit
RAISING
zcx_abapgit_exception .
METHODS get_data_config
RETURNING
VALUE(ri_config) TYPE REF TO zif_abapgit_data_config
RAISING
zcx_abapgit_exception .
METHODS get_dot_apack
RETURNING
VALUE(ro_dot_apack) TYPE REF TO zcl_abapgit_apack_reader .
METHODS get_log
RETURNING
VALUE(ri_log) TYPE REF TO zif_abapgit_log .
METHODS get_unsupported_objects_local
RETURNING
VALUE(rt_objects) TYPE zif_abapgit_definitions=>ty_items_tt
RAISING
zcx_abapgit_exception .
METHODS has_remote_source
ABSTRACT
RETURNING
VALUE(rv_yes) TYPE abap_bool .
METHODS refresh_local_object
IMPORTING
!iv_obj_type TYPE tadir-object
!iv_obj_name TYPE tadir-obj_name
RAISING
zcx_abapgit_exception .
METHODS refresh_local_objects
RAISING
zcx_abapgit_exception .
METHODS remove_ignored_files
CHANGING
!ct_files TYPE zif_abapgit_git_definitions=>ty_files_tt
RAISING
zcx_abapgit_exception .
METHODS reset_status .
METHODS set_files_remote
IMPORTING
!it_files TYPE zif_abapgit_git_definitions=>ty_files_tt .
@ -55,10 +103,6 @@ CLASS zcl_abapgit_repo DEFINITION
!is_settings TYPE zif_abapgit_persistence=>ty_repo-local_settings
RAISING
zcx_abapgit_exception .
METHODS has_remote_source
ABSTRACT
RETURNING
VALUE(rv_yes) TYPE abap_bool .
METHODS status
IMPORTING
!ii_log TYPE REF TO zif_abapgit_log OPTIONAL
@ -71,39 +115,6 @@ CLASS zcl_abapgit_repo DEFINITION
!iv_offline TYPE abap_bool
RAISING
zcx_abapgit_exception .
METHODS create_new_log
IMPORTING
!iv_title TYPE string OPTIONAL
RETURNING
VALUE(ri_log) TYPE REF TO zif_abapgit_log .
METHODS get_log
RETURNING
VALUE(ri_log) TYPE REF TO zif_abapgit_log .
METHODS refresh_local_object
IMPORTING
!iv_obj_type TYPE tadir-object
!iv_obj_name TYPE tadir-obj_name
RAISING
zcx_abapgit_exception .
METHODS refresh_local_objects
RAISING
zcx_abapgit_exception .
METHODS reset_status .
METHODS get_unsupported_objects_local
RETURNING
VALUE(rt_objects) TYPE zif_abapgit_definitions=>ty_items_tt
RAISING
zcx_abapgit_exception .
METHODS remove_ignored_files
CHANGING
ct_files TYPE zif_abapgit_git_definitions=>ty_files_tt
RAISING
zcx_abapgit_exception .
METHODS check_and_create_package
IMPORTING
iv_package TYPE devclass
RAISING
zcx_abapgit_exception .
PROTECTED SECTION.
DATA mt_local TYPE zif_abapgit_definitions=>ty_files_item_tt .
@ -121,11 +132,7 @@ CLASS zcl_abapgit_repo DEFINITION
VALUE(ro_dot) TYPE REF TO zcl_abapgit_apack_reader
RAISING
zcx_abapgit_exception .
METHODS set_dot_apack
IMPORTING
!io_dot_apack TYPE REF TO zcl_abapgit_apack_reader
RAISING
zcx_abapgit_exception .
METHODS reset_remote .
METHODS set
IMPORTING
!iv_url TYPE zif_abapgit_persistence=>ty_repo-url OPTIONAL
@ -140,32 +147,43 @@ CLASS zcl_abapgit_repo DEFINITION
!iv_switched_origin TYPE zif_abapgit_persistence=>ty_repo-switched_origin OPTIONAL
RAISING
zcx_abapgit_exception .
METHODS reset_remote .
METHODS set_dot_apack
IMPORTING
!io_dot_apack TYPE REF TO zcl_abapgit_apack_reader
RAISING
zcx_abapgit_exception .
PRIVATE SECTION.
METHODS check_for_restart .
METHODS check_language
RAISING
zcx_abapgit_exception .
METHODS check_write_protect
RAISING
zcx_abapgit_exception .
METHODS deserialize_data
IMPORTING
!is_checks TYPE zif_abapgit_definitions=>ty_deserialize_checks
CHANGING
!ct_files TYPE zif_abapgit_git_definitions=>ty_file_signatures_tt
RAISING
zcx_abapgit_exception .
METHODS deserialize_dot_abapgit
CHANGING
ct_files TYPE zif_abapgit_git_definitions=>ty_file_signatures_tt
!ct_files TYPE zif_abapgit_git_definitions=>ty_file_signatures_tt
RAISING
zcx_abapgit_exception.
zcx_abapgit_exception .
METHODS deserialize_objects
IMPORTING
!is_checks TYPE zif_abapgit_definitions=>ty_deserialize_checks
!ii_log TYPE REF TO zif_abapgit_log
CHANGING
ct_files TYPE zif_abapgit_git_definitions=>ty_file_signatures_tt
!ct_files TYPE zif_abapgit_git_definitions=>ty_file_signatures_tt
RAISING
zcx_abapgit_exception.
METHODS deserialize_data
IMPORTING
!is_checks TYPE zif_abapgit_definitions=>ty_deserialize_checks
zcx_abapgit_exception .
METHODS normalize_local_settings
CHANGING
ct_files TYPE zif_abapgit_git_definitions=>ty_file_signatures_tt
RAISING
zcx_abapgit_exception.
!cs_local_settings TYPE zif_abapgit_persistence=>ty_local_settings .
METHODS notify_listener
IMPORTING
!is_change_mask TYPE zif_abapgit_persistence=>ty_repo_meta_mask
@ -174,21 +192,14 @@ CLASS zcl_abapgit_repo DEFINITION
METHODS update_last_deserialize
RAISING
zcx_abapgit_exception .
METHODS check_for_restart .
METHODS check_write_protect
METHODS check_abap_language_version
RAISING
zcx_abapgit_exception .
METHODS check_language
RAISING
zcx_abapgit_exception .
METHODS normalize_local_settings
CHANGING
cs_local_settings TYPE zif_abapgit_persistence=>ty_local_settings.
ENDCLASS.
CLASS zcl_abapgit_repo IMPLEMENTATION.
CLASS ZCL_ABAPGIT_REPO IMPLEMENTATION.
METHOD bind_listener.
@ -782,6 +793,7 @@ CLASS zcl_abapgit_repo IMPLEMENTATION.
check_write_protect( ).
check_language( ).
check_abap_language_version( ).
rs_checks = zcl_abapgit_objects=>deserialize_checks( me ).
@ -910,4 +922,19 @@ CLASS zcl_abapgit_repo IMPLEMENTATION.
METHOD zif_abapgit_repo~set_dot_abapgit.
set( is_dot_abapgit = io_dot_abapgit->get_data( ) ).
ENDMETHOD.
METHOD check_abap_language_version.
DATA lo_abapgit_abap_language_vers TYPE REF TO zcl_abapgit_abap_language_vers.
DATA lv_text TYPE string.
CREATE OBJECT lo_abapgit_abap_language_vers.
IF lo_abapgit_abap_language_vers->is_import_allowed( io_repo = me
iv_package = ms_data-package ) = abap_false.
lv_text = |Repository cannot be imported. | &&
|ABAP Language Version of linked package is not compatible with repository settings.|.
zcx_abapgit_exception=>raise( iv_text = lv_text ).
ENDIF.
ENDMETHOD.
ENDCLASS.

View File

@ -11,14 +11,15 @@ INTERFACE zif_abapgit_dot_abapgit PUBLIC.
TYPES:
BEGIN OF ty_dot_abapgit,
master_language TYPE spras,
i18n_languages TYPE zif_abapgit_definitions=>ty_languages,
use_lxe TYPE abap_bool,
starting_folder TYPE string,
folder_logic TYPE string,
ignore TYPE STANDARD TABLE OF string WITH DEFAULT KEY,
requirements TYPE ty_requirement_tt,
version_constant TYPE string,
master_language TYPE spras,
i18n_languages TYPE zif_abapgit_definitions=>ty_languages,
use_lxe TYPE abap_bool,
starting_folder TYPE string,
folder_logic TYPE string,
ignore TYPE STANDARD TABLE OF string WITH DEFAULT KEY,
requirements TYPE ty_requirement_tt,
version_constant TYPE string,
abap_language_version TYPE string,
END OF ty_dot_abapgit .
CONSTANTS:
@ -26,6 +27,13 @@ INTERFACE zif_abapgit_dot_abapgit PUBLIC.
prefix TYPE string VALUE 'PREFIX',
full TYPE string VALUE 'FULL',
mixed TYPE string VALUE 'MIXED',
END OF c_folder_logic .
END OF c_folder_logic,
BEGIN OF c_abap_language_version,
standard TYPE string VALUE 'standard',
key_user TYPE string VALUE 'keyUser',
cloud_development TYPE string VALUE 'cloudDevelopment',
undefined TYPE string VALUE 'undefined',
END OF c_abap_language_version.
ENDINTERFACE.

View File

@ -0,0 +1,127 @@
CLASS zcl_abapgit_abap_language_vers DEFINITION
PUBLIC
FINAL
CREATE PUBLIC .
PUBLIC SECTION.
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 is_import_allowed
IMPORTING
!io_repo TYPE REF TO zif_abapgit_repo
!iv_package TYPE devclass
RETURNING
VALUE(rv_allowed) TYPE abap_bool .
PROTECTED SECTION.
PRIVATE SECTION.
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
IMPORTING
!io_repo TYPE REF TO zif_abapgit_repo
RETURNING
VALUE(rv_abap_language_version) TYPE string .
ENDCLASS.
CLASS ZCL_ABAPGIT_ABAP_LANGUAGE_VERS IMPLEMENTATION.
METHOD get_abap_language_vers_by_devc.
DATA lv_abap_lang_version_devc TYPE string.
DATA lo_abap_language_version_cfg TYPE REF TO object.
TRY.
CREATE OBJECT lo_abap_language_version_cfg TYPE ('IF_ABAP_LANGUAGE_VERSION_CFG').
CALL METHOD ('CL_ABAP_LANGUAGE_VERSION_CFG')=>('GET_INSTANCE')
RECEIVING
ro_instance = lo_abap_language_version_cfg.
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.
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 lo_abap_language_version TYPE REF TO object.
TRY.
CREATE OBJECT lo_abap_language_version TYPE ('IF_ABAP_LANGUAGE_VERSION').
CALL METHOD ('CL_ABAP_LANGUAGE_VERSION')=>('GET_INSTANCE')
RECEIVING
ro_instance = 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_name = iv_package
RECEIVING
rv_default_version = rv_allowed_abap_langu_version.
CATCH cx_root.
rv_allowed_abap_langu_version = zif_abapgit_aff_types_v1=>co_abap_language_version-standard.
"to do: here we need to differentiate between source code object and non-source code objects
ENDTRY.
ENDMETHOD.
METHOD get_abap_language_vers_by_repo.
rv_abap_language_version = io_repo->get_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 is_import_allowed.
CASE get_abap_language_vers_by_repo( io_repo ).
WHEN zif_abapgit_dot_abapgit=>c_abap_language_version-undefined.
rv_allowed = abap_true.
WHEN OTHERS.
IF get_abap_language_vers_by_repo( io_repo ) = get_abap_language_vers_by_devc( iv_package ).
rv_allowed = abap_true.
ELSEIF
get_abap_language_vers_by_devc( iv_package ) = zif_abapgit_dot_abapgit=>c_abap_language_version-undefined AND
get_abap_language_vers_by_repo( io_repo ) = zif_abapgit_dot_abapgit=>c_abap_language_version-standard.
rv_allowed = abap_true.
ELSE.
rv_allowed = abap_false.
ENDIF.
ENDCASE.
ENDMETHOD.
ENDCLASS.

View File

@ -0,0 +1,16 @@
<?xml version="1.0" encoding="utf-8"?>
<abapGit version="v1.0.0" serializer="LCL_OBJECT_CLAS" serializer_version="v1.0.0">
<asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
<asx:values>
<VSEOCLASS>
<CLSNAME>ZCL_ABAPGIT_ABAP_LANGUAGE_VERS</CLSNAME>
<LANGU>E</LANGU>
<DESCRIPT>abapGit - ABAP Language Version</DESCRIPT>
<STATE>1</STATE>
<CLSCCINCL>X</CLSCCINCL>
<FIXPT>X</FIXPT>
<UNICODE>X</UNICODE>
</VSEOCLASS>
</asx:values>
</asx:abap>
</abapGit>

View File

@ -13,9 +13,10 @@ INTERFACE zif_abapgit_definitions
BEGIN OF ty_item.
INCLUDE TYPE ty_item_signature.
TYPES:
srcsystem TYPE tadir-srcsystem,
origlang TYPE tadir-masterlang,
inactive TYPE abap_bool,
srcsystem TYPE tadir-srcsystem,
origlang TYPE tadir-masterlang,
inactive TYPE abap_bool,
abap_language_version TYPE zif_abapgit_aff_types_v1=>ty_abap_language_version,
END OF ty_item .
TYPES:
ty_items_tt TYPE STANDARD TABLE OF ty_item WITH DEFAULT KEY .
@ -470,6 +471,13 @@ INTERFACE zif_abapgit_definitions
skip TYPE ty_method VALUE '?',
END OF c_method .
CONSTANTS:
BEGIN OF c_abap_language_version,
standard TYPE c VALUE '',
keyuser TYPE c VALUE '2',
clouddevelopment TYPE c VALUE '5',
END OF c_abap_language_version.
TYPES:
ty_sap_langu_tab TYPE STANDARD TABLE OF langu WITH DEFAULT KEY.
TYPES: