This commit is contained in:
EduardoCopat 2017-09-15 10:21:35 -03:00
commit 2adb787bc0
81 changed files with 4252 additions and 1310 deletions

View File

@ -1,3 +1,19 @@
## Bug Reports
A bug is a _demonstrable problem_ that is caused by the code in the repository. Good bug reports are extremely helpful - thank you!
Guidelines for bug reports:
1. **Use the GitHub issue search** — check if the issue has already been
reported.
2. **Check if the issue has been fixed** — try to reproduce it using the
latest `master` or development branch in the repository.
3. **Demonstrate the problem** — provide clear steps that can be reproduced.
A good bug report should not leave others needing to chase you up for more information. Please try to be as detailed as possible in your report. What is your environment? What steps will reproduce the issue? What would you expect to be the outcome? All these details will help to fix any potential bugs.
## Development Guidelines
a. Make sure there is an open issue for the stuff that you want to work on. When starting the development add a comment in the issue. This will allow for discussing possible solutions, and avoid having multiple people look into the same issue.

View File

@ -8,6 +8,80 @@ Legend
+ : added
- : removed
2017-09-11 v1.41.2
------------------
* FUGR table maintenance, namespaces
* SICF show error message when deleting root node
* DDLS better error messages
* ENHS allow transport popup
+ experimental, optional opt-in: CLAS deserialization performance
2017-09-03 v1.41.1
------------------
* DDLS changed_by
* Deletion of objects when performing "reset local"
* Moved first class to global in the abapGit development version
2017-08-23 v1.41.0
------------------
+ SHMA supported
+ ENHO for function groups + web dynpro supported
2017-08-11 v1.40.0
------------------
+ JOBD supported
+ CMPT supported
* downport fix
2017-08-07 v1.39.0
------------------
+ DIAL supported
* fix XML dump
2017-08-05 v1.38.0
------------------
! SICF serialization changed
* TOBJ serialization added TDDAT, TVDIR, and TVIMF tables
* TYPE fix overwriting/pull
2017-08-03 v1.37.8
------------------
* Fix TABL changed_by
* Downport to 702
2017-07-28 v1.37.7
------------------
* Fix dump when parsing commit author, regex
* Fix decoding of commit body, newlines
* SAMC SAPC refactoring
* DOMA diff fix, sorting
2017-07-23 v1.37.6
------------------
* SMIM exists() performance
* Background mode performance improvements
* DOCT fix changed_by() dump
2017-07-17 v1.37.5
------------------
* fix FUGR namespaces
* few ASSERTs removed
* decoding of non-7bit values from html gui
2017-07-09 v1.37.4
------------------
* SSFO serialization fix
* Adler32 optimization
! progress indicator when encoding object pack
* CLAS diff fix, texts sorted
* SSST bug, only inactive exists
! Global settings persistence changed to XML
2017-06-29 v1.37.3
------------------
* fixed 702 compatibility
* fixed dump when calling branch overview page
2017-06-10 v1.37.2
------------------
* fixed unit tests

View File

@ -1,5 +1,5 @@
<div class="page-head">
<div class="wrap">
<a href="./index.html"><img class="head-logo" src="img/logo.svg" height="40" alt="abapGit"></a><span class="head-title">abapGit documentation</span>
<a href="./"><img class="head-logo" src="img/logo.svg" height="40" alt="abapGit"></a><span class="head-title">abapGit documentation</span>
</div>
</div>

View File

@ -6,7 +6,7 @@ order: 10
1: Run report ZABAPGIT via SE38 or SA38
2: Click "New Offline Repo"
2: Click "+ Offline"
![](img/offline1.png)
3: Enter project name eg. "abapOpenChecks", and an empty package eg. "$AOC"

Binary file not shown.

Before

Width:  |  Height:  |  Size: 16 KiB

After

Width:  |  Height:  |  Size: 6.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.3 KiB

After

Width:  |  Height:  |  Size: 6.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.5 KiB

After

Width:  |  Height:  |  Size: 4.3 KiB

View File

@ -20,6 +20,9 @@ order: 30
[SAP Inside Track Hamburg](https://larshp.github.io/sithh2016/)
-Lars Hvam
[SAP Inside Track Munich](https://www.slideshare.net/h_neumann/what-the-git-sap-inside-track-munich-2016)
-Hendrik Neumann
[SAP Teched Barcelona](https://larshp.github.io/teched-2016-emea/)
-Lars Hvam
@ -40,5 +43,14 @@ order: 30
Mastering SAP Technologies, Melbourne, May 23rd
-Graham Robinson
[abapGit so easy](https://blogs.sap.com/2017/06/21/abapgit-so-easy/)
-Graham Robinson
SAUG National Summit 2017, September 5th
-Graham Robinson
SAP Teched Las Vegas
-Graham Robinson
-Graham Robinson
abapGit, [IT Conference on SAP Technologies](http://www.itconferencesap.com/), Cluj
-Lars Hvam

View File

@ -31,9 +31,12 @@ Example: abapGit own .abapgit.xml
# Description
## Location
The `.abapgit.xml` file must be located in the root folder of the git repository.
## Master Language
The language in which all documentation and dictionary elements texts will be created. Follows SAP `sy-langu` values.
The language in which all documentation and dictionary elements texts will be created. Follows SAP `sy-langu` values. Note that this implies that all objects in a repository will/should have the same master language.
## Starting Folder
@ -69,4 +72,4 @@ will give folder structure /zsomething/zhello/
## Ignore
Files which abapGit will not download into your ABAP system.
Files which abapGit will not download into your ABAP system.

View File

@ -8,12 +8,16 @@ order: 20
Type | Description | Supported
:------------ | :------------ | ------------:
ACID | Checkpoint Group | Yes
AOBJ | Archiving Object | [#804](https://github.com/larshp/abapGit/issues/804)
AUTH | Authorization Check Fields | Yes
BOBF | BOPF: Business Object Model | [Plugin](https://github.com/larshp/abapGit-Plugins)
CHDO | Change Document Object | [#802](https://github.com/larshp/abapGit/issues/802)
CLAS | Class (ABAP Objects) | Yes
CMOD | Customer enhancement projects | [#151](https://github.com/larshp/abapGit/issues/151)
CMPT | Code Composer Template | Yes
DCLS | ABAP Data Control Language Sources | Yes
DDLS | Data Definition Language Source | Yes
DIAL | Dialog Module | Yes
DOCT | General Text | Yes
DOCV | Documentation (Independent) | Yes
DOMA | Domain | Yes
@ -21,7 +25,7 @@ DTEL | Data Element | Yes
ECAT | eCATT Test Script | [#163](https://github.com/larshp/abapGit/issues/163)
ECTD | eCATT Test Data Container | [#105](https://github.com/larshp/abapGit/issues/105)
ENHC | Composite Enhancement Implementation | Yes
ENHO | Enhancement Implementation | Partial [#113](https://github.com/larshp/abapGit/issues/113)
ENHO | Enhancement Implementation | Yes
ENHS | Enhancement Spot | Yes
ENQU | Lock Object | Yes
FORM | SAPscript form | Yes
@ -31,6 +35,7 @@ IARP | Parameters of IAC Language Resource | Yes
IASP | Parameters of an IAC service | Yes
IATU | Language-Independent IAC Templates | Yes
IWPR | Gateway Business Suite Enablement - Service Builder Project | [#75](https://github.com/larshp/abapGit/issues/75)
JOBD | Technical Job Definition | Yes
LPDC | Launchpad short texts | [#107](https://github.com/larshp/abapGit/issues/107)
MSAG | Message Class | Yes
NROB | Number Range Objects | Yes
@ -38,24 +43,26 @@ PARA | SPA/GPA Parameters | Yes
PDTS | Standard Task | [#153](https://github.com/larshp/abapGit/issues/153)
PDWS | Workflow templates | [#154](https://github.com/larshp/abapGit/issues/154)
PINF | Package interface | Yes
PRAG | Pragma in ABAP Source Code | Yes
PROG | Program | Yes
SAMC | ABAP Messaging Channels | Yes
SAPC | ABAP Push Channels | Yes
SFBF | Business Function + Assignment | Yes
SFBS | Business Function Set + Assignment | Yes
SFPF | Form Object: Form | Yes
SFPI | Form Object: Interface | Yes
SFSW | Switch + Assignment of Objects to the Switch | Yes
SHI3 | General structure storage: Definition of a structure | Yes
SHLP | Search Help | Yes
SHMA | Shared Objects: Defined Area Attributes | Yes
SICF | ICF Service | Yes
SMIM | Info Object from the MIME Repository | Yes
SOTS | All Concepts (OTR) of a Package - Long Texts | [#792](https://github.com/larshp/abapGit/issues/792)
SPLO | Format Types | Yes
SPRX | Proxy Object | [#87](https://github.com/larshp/abapGit/issues/87)
SRFC | RFC Service | [#155](https://github.com/larshp/abapGit/issues/155)
SSFO | SAP Smart Form | Yes
SSST | SAP Smart Style | Yes
SFPI | Form Object: Interface | Yes
SFPF | Form Object: Form | Yes
SHMA | Shared Objects: Defined Area Attributes | [#85](https://github.com/larshp/abapGit/issues/85)
SMIM | Info Object from the MIME Repository | Yes
SPRX | Proxy Object | [#87](https://github.com/larshp/abapGit/issues/87)
STYL | SAPscript style | Yes
SUSC | Authorization object class | Yes
SUSO | Authorization object | Yes
@ -77,4 +84,4 @@ WDYN | Web Dynpro Component | Yes
WEBI | Virtual End Point | Yes
XSLT | Transformation | Yes
Also see https://github.com/larshp/abapGit-Plugins
Also see [https://github.com/larshp/abapGit-Plugins](https://github.com/larshp/abapGit-Plugins)

View File

@ -14,6 +14,11 @@
"title": "abap-log",
"description": "Logging library for ABAP"
},
"https://github.com/epeterson320/ABAP-Logger.git":
{
"title": "ABAP-Logger",
"description": "ABAP Logging as painless as any other language"
},
"https://github.com/sbcgua/mockup_loader.git":
{
"title": "mockup_loader",

View File

@ -8,7 +8,7 @@
"url": "git+https://github.com/larshp/abapGit.git"
},
"devDependencies": {
"abapmerge": "^0.6.2",
"abapmerge": "^0.7.0",
"abaplint": ">=0.26.7"
}
}

View File

@ -48,6 +48,7 @@ INCLUDE zabapgit_sap_package.
INCLUDE zabapgit_folder_logic.
INCLUDE zabapgit_requirements.
INCLUDE zabapgit_authorizations.
INCLUDE zabapgit_exit.
INCLUDE zabapgit_stage.
INCLUDE zabapgit_git_helpers.

View File

@ -113,25 +113,41 @@ CLASS lcl_background IMPLEMENTATION.
METHOD push_auto.
TYPES: BEGIN OF ty_changed,
filename TYPE string,
path TYPE string,
changed_by TYPE xubname,
END OF ty_changed.
DATA: ls_comment TYPE lif_defs=>ty_comment,
ls_files TYPE lif_defs=>ty_stage_files,
lt_changed TYPE STANDARD TABLE OF ty_changed WITH DEFAULT KEY,
lt_users TYPE STANDARD TABLE OF xubname WITH DEFAULT KEY,
ls_user_files LIKE ls_files,
lv_changed_by TYPE xubname,
lo_stage TYPE REF TO lcl_stage.
FIELD-SYMBOLS: <ls_local> LIKE LINE OF ls_files-local.
FIELD-SYMBOLS: <ls_changed> LIKE LINE OF lt_changed,
<ls_local> LIKE LINE OF ls_files-local.
ls_files = lcl_stage_logic=>get( io_repo ).
DO.
READ TABLE ls_files-local INDEX 1 ASSIGNING <ls_local>.
IF sy-subrc <> 0.
EXIT.
ENDIF.
LOOP AT ls_files-local ASSIGNING <ls_local>.
lv_changed_by = lcl_objects=>changed_by( <ls_local>-item ).
APPEND lv_changed_by TO lt_users.
APPEND INITIAL LINE TO lt_changed ASSIGNING <ls_changed>.
<ls_changed>-changed_by = lv_changed_by.
<ls_changed>-filename = <ls_local>-file-filename.
<ls_changed>-path = <ls_local>-file-path.
ENDLOOP.
SORT lt_users ASCENDING.
DELETE ADJACENT DUPLICATES FROM lt_users.
LOOP AT lt_users INTO lv_changed_by.
CLEAR ls_comment.
ls_comment-committer-name = lcl_objects=>changed_by( <ls_local>-item ).
ls_comment-committer-name = lv_changed_by.
ls_comment-committer-email = |{ ls_comment-committer-name }@localhost|.
CREATE OBJECT lo_stage
@ -142,7 +158,12 @@ CLASS lcl_background IMPLEMENTATION.
CLEAR ls_user_files.
LOOP AT ls_files-local ASSIGNING <ls_local>.
IF lcl_objects=>changed_by( <ls_local>-item ) = ls_comment-committer-name.
READ TABLE lt_changed WITH KEY
path = <ls_local>-file-path
filename = <ls_local>-file-filename
changed_by = lv_changed_by
TRANSPORTING NO FIELDS.
IF sy-subrc = 0.
WRITE: / 'stage' ##NO_TEXT,
ls_comment-committer-name,
<ls_local>-file-path,
@ -156,14 +177,11 @@ CLASS lcl_background IMPLEMENTATION.
ENDIF.
ENDLOOP.
ls_comment-comment = build_comment( ls_user_files ).
ls_comment-comment = build_comment( ls_user_files ).
io_repo->push( is_comment = ls_comment
io_stage = lo_stage ).
ls_files = lcl_stage_logic=>get( io_repo ).
ENDDO.
ENDLOOP.
ENDMETHOD.

View File

@ -7,7 +7,7 @@ TYPE-POOLS seop.
INTERFACE lif_defs.
CONSTANTS: gc_xml_version TYPE string VALUE 'v1.0.0', "#EC NOTEXT
gc_abap_version TYPE string VALUE 'v1.37.2'. "#EC NOTEXT
gc_abap_version TYPE string VALUE 'v1.41.2'. "#EC NOTEXT
TYPES: ty_type TYPE c LENGTH 6,
ty_bitbyte TYPE c LENGTH 8,
@ -33,6 +33,8 @@ INTERFACE lif_defs.
TYPES: ty_string_tt TYPE STANDARD TABLE OF string WITH DEFAULT KEY.
TYPES: ty_icm_sinfo2_tt TYPE STANDARD TABLE OF icm_sinfo2 WITH DEFAULT KEY.
TYPES:
BEGIN OF ty_git_user,
name TYPE string,
@ -197,7 +199,7 @@ INTERFACE lif_defs.
CONSTANTS: gc_root_dir TYPE string VALUE '/',
gc_dot_abapgit TYPE string VALUE '.abapgit.xml' ##NO_TEXT,
gc_author_regex TYPE string VALUE '^([\w\s\.@\-_1-9]+) <(.*)> (\d{10})\s?.\d{4}$' ##NO_TEXT.
gc_author_regex TYPE string VALUE '^([\\\w\s\.@\-_1-9\(\) ]+) <(.*)> (\d{10})\s?.\d{4}$' ##NO_TEXT.
CONSTANTS: BEGIN OF gc_action,
repo_clone TYPE string VALUE 'repo_clone',

View File

@ -0,0 +1,51 @@
*&---------------------------------------------------------------------*
*& Include ZABAPGIT_USER_EXITS
*&---------------------------------------------------------------------*
INTERFACE lif_exit.
METHODS:
change_local_host
CHANGING ct_hosts TYPE lif_defs=>ty_icm_sinfo2_tt,
allow_sap_objects
RETURNING VALUE(rv_allowed) TYPE abap_bool.
ENDINTERFACE.
* add class LCL_USER_EXIT implementing LIF_EXIT in following include,
* place the include in a different package than ZABAPGIT
INCLUDE zabapgit_user_exit IF FOUND.
*******************
CLASS lcl_exit DEFINITION FINAL.
PUBLIC SECTION.
CLASS-METHODS: get_instance RETURNING VALUE(ri_exit) TYPE REF TO lif_exit.
INTERFACES: lif_exit.
ENDCLASS.
CLASS lcl_exit IMPLEMENTATION.
METHOD get_instance.
TRY.
CREATE OBJECT ri_exit TYPE ('LCL_USER_EXIT').
CATCH cx_sy_create_object_error.
CREATE OBJECT ri_exit TYPE lcl_exit.
ENDTRY.
ENDMETHOD.
METHOD lif_exit~change_local_host.
* default behavior
RETURN.
ENDMETHOD.
METHOD lif_exit~allow_sap_objects.
rv_allowed = abap_false.
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_EXIT</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_USER_EXITS</ENTRY>
<LENGTH>27</LENGTH>
</item>
</TPOOL>
</asx:values>
</asx:abap>
</abapGit>

View File

@ -27,7 +27,8 @@ CLASS lcl_file_status DEFINITION FINAL
it_local TYPE lif_defs=>ty_files_item_tt
it_remote TYPE lif_defs=>ty_files_tt
it_cur_state TYPE lif_defs=>ty_file_signatures_tt
RETURNING VALUE(rt_results) TYPE lif_defs=>ty_results_tt,
RETURNING VALUE(rt_results) TYPE lif_defs=>ty_results_tt
RAISING lcx_exception,
run_checks
IMPORTING io_log TYPE REF TO lcl_log
it_results TYPE lif_defs=>ty_results_tt

View File

@ -114,6 +114,12 @@ CLASS lcl_git_pack DEFINITION FINAL FRIENDS ltcl_git_pack.
IMPORTING is_commit TYPE ty_commit
RETURNING VALUE(rv_data) TYPE xstring.
CLASS-METHODS type_and_length
IMPORTING iv_type TYPE lif_defs=>ty_type
iv_length TYPE i
RETURNING VALUE(rv_xstring) TYPE xstring
RAISING lcx_exception.
PRIVATE SECTION.
CONSTANTS: c_pack_start TYPE x LENGTH 4 VALUE '5041434B', " PACK
c_zlib TYPE x LENGTH 2 VALUE '789C',
@ -124,11 +130,6 @@ CLASS lcl_git_pack DEFINITION FINAL FRIENDS ltcl_git_pack.
CHANGING ct_objects TYPE lif_defs=>ty_objects_tt
RAISING lcx_exception.
CLASS-METHODS type_and_length
IMPORTING is_object TYPE lif_defs=>ty_object
RETURNING VALUE(rv_xstring) TYPE xstring
RAISING lcx_exception.
CLASS-METHODS delta
IMPORTING is_object TYPE lif_defs=>ty_object
CHANGING ct_objects TYPE lif_defs=>ty_objects_tt
@ -251,7 +252,7 @@ CLASS lcl_git_transport IMPLEMENTATION.
lcl_git_utils=>get_null( ) &&
` ` &&
lv_cap_list &&
lif_defs=>gc_newline. "#EC NOTEXT
lif_defs=>gc_newline. "#EC NOTEXT
lv_cmd_pkt = lcl_git_utils=>pkt_string( lv_line ).
lv_buffer = lv_cmd_pkt && '0000'.
@ -347,17 +348,17 @@ CLASS lcl_git_transport IMPLEMENTATION.
lv_capa = 'side-band-64k no-progress multi_ack agent='
&& lcl_http=>get_agent( ) ##NO_TEXT.
lv_line = 'want' && ` ` && <ls_branch>-sha1
&& ` ` && lv_capa && lif_defs=>gc_newline. "#EC NOTEXT
&& ` ` && lv_capa && lif_defs=>gc_newline. "#EC NOTEXT
ELSE.
lv_line = 'want' && ` ` && <ls_branch>-sha1
&& lif_defs=>gc_newline. "#EC NOTEXT
&& lif_defs=>gc_newline. "#EC NOTEXT
ENDIF.
lv_buffer = lv_buffer && lcl_git_utils=>pkt_string( lv_line ).
ENDLOOP.
IF iv_deepen = abap_true.
lv_buffer = lv_buffer && lcl_git_utils=>pkt_string( 'deepen 1'
&& lif_defs=>gc_newline ). "#EC NOTEXT
&& lif_defs=>gc_newline ). "#EC NOTEXT
ENDIF.
lv_buffer = lv_buffer
@ -430,7 +431,7 @@ CLASS lcl_git_pack IMPLEMENTATION.
lv_x TYPE x LENGTH 1.
CASE is_object-type.
CASE iv_type.
WHEN lif_defs=>gc_type-commit.
lv_type = '001'.
WHEN lif_defs=>gc_type-tree.
@ -443,7 +444,7 @@ CLASS lcl_git_pack IMPLEMENTATION.
lcx_exception=>raise( 'Unexpected object type while encoding pack' ).
ENDCASE.
lv_x4 = xstrlen( is_object-data ).
lv_x4 = iv_length.
DO 32 TIMES.
GET BIT sy-index OF lv_x4 INTO lv_c.
CONCATENATE lv_bits lv_c INTO lv_bits.
@ -611,6 +612,7 @@ CLASS lcl_git_pack IMPLEMENTATION.
DATA: lv_string TYPE string,
lv_word TYPE string,
lv_length TYPE i,
lv_trash TYPE string ##NEEDED,
lt_string TYPE TABLE OF string.
@ -622,34 +624,41 @@ CLASS lcl_git_pack IMPLEMENTATION.
SPLIT lv_string AT lif_defs=>gc_newline INTO TABLE lt_string.
LOOP AT lt_string ASSIGNING <lv_string>.
IF NOT rs_commit-committer IS INITIAL.
CONCATENATE rs_commit-body <lv_string> INTO rs_commit-body
SEPARATED BY lif_defs=>gc_newline.
ELSE.
SPLIT <lv_string> AT space INTO lv_word lv_trash.
CASE lv_word.
WHEN 'tree'.
rs_commit-tree = <lv_string>+5.
WHEN 'parent'.
IF rs_commit-parent IS INITIAL.
rs_commit-parent = <lv_string>+7.
ELSE.
rs_commit-parent2 = <lv_string>+7.
ENDIF.
WHEN 'author'.
rs_commit-author = <lv_string>+7.
WHEN 'committer'.
rs_commit-committer = <lv_string>+10.
WHEN OTHERS.
ASSERT 0 = 1.
ENDCASE.
ENDIF.
* IF NOT rs_commit-committer IS INITIAL.
* CONCATENATE rs_commit-body <lv_string> INTO rs_commit-body
* SEPARATED BY lif_defs=>gc_newline.
* ELSE.
lv_length = strlen( <lv_string> ) + 1.
lv_string = lv_string+lv_length.
SPLIT <lv_string> AT space INTO lv_word lv_trash.
CASE lv_word.
WHEN 'tree'.
rs_commit-tree = <lv_string>+5.
WHEN 'parent'.
IF rs_commit-parent IS INITIAL.
rs_commit-parent = <lv_string>+7.
ELSE.
rs_commit-parent2 = <lv_string>+7.
ENDIF.
WHEN 'author'.
rs_commit-author = <lv_string>+7.
WHEN 'committer'.
rs_commit-committer = <lv_string>+10.
EXIT. " current loop
WHEN OTHERS.
ASSERT 0 = 1.
ENDCASE.
* ENDIF.
ENDLOOP.
rs_commit-body = lv_string+1.
* strip first newline
IF strlen( rs_commit-body ) >= 2.
rs_commit-body = rs_commit-body+2.
ENDIF.
* IF strlen( rs_commit-body ) >= 2.
* rs_commit-body = rs_commit-body+2.
* ENDIF.
IF rs_commit-author IS INITIAL
OR rs_commit-committer IS INITIAL
@ -682,25 +691,24 @@ CLASS lcl_git_pack IMPLEMENTATION.
METHOD delta.
DATA: lv_delta TYPE xstring,
lv_base TYPE xstring,
lv_result TYPE xstring,
* lv_bitbyte TYPE ty_bitbyte,
lv_offset TYPE i,
lv_sha1 TYPE lif_defs=>ty_sha1,
ls_object LIKE LINE OF ct_objects,
lv_len TYPE i,
lv_org TYPE x,
* lv_i TYPE i,
lv_x TYPE x.
FIELD-SYMBOLS: <ls_object> LIKE LINE OF ct_objects.
DEFINE _eat_byte.
lv_x = lv_delta(1).
lv_delta = lv_delta+1.
END-OF-DEFINITION.
DATA: lv_delta TYPE xstring,
lv_base TYPE xstring,
lv_result TYPE xstring,
lv_offset TYPE i,
lv_sha1 TYPE lif_defs=>ty_sha1,
ls_object LIKE LINE OF ct_objects,
lv_len TYPE i,
lv_org TYPE x,
lv_x TYPE x.
FIELD-SYMBOLS: <ls_object> LIKE LINE OF ct_objects.
lv_delta = is_object-data.
* find base
@ -1025,26 +1033,35 @@ CLASS lcl_git_pack IMPLEMENTATION.
METHOD encode.
DATA: lv_sha1 TYPE x LENGTH 20,
lv_adler32 TYPE lcl_hash=>ty_adler32,
lv_len TYPE i,
lv_compressed TYPE xstring,
lv_xstring TYPE xstring.
DATA: lv_sha1 TYPE x LENGTH 20,
lv_adler32 TYPE lcl_hash=>ty_adler32,
lv_compressed TYPE xstring,
lv_xstring TYPE xstring,
lv_objects_total TYPE i,
lv_objects_processed TYPE i.
FIELD-SYMBOLS: <ls_object> LIKE LINE OF it_objects.
rv_data = c_pack_start.
CONCATENATE rv_data c_version INTO rv_data IN BYTE MODE.
lv_len = lines( it_objects ).
lv_xstring = lcl_convert=>int_to_xstring( iv_i = lv_len
iv_length = 4 ).
lv_xstring = lcl_convert=>int_to_xstring4( lines( it_objects ) ).
CONCATENATE rv_data lv_xstring INTO rv_data IN BYTE MODE.
lv_objects_total = lines( it_objects ).
LOOP AT it_objects ASSIGNING <ls_object>.
lv_xstring = type_and_length( <ls_object> ).
lv_objects_processed = sy-tabix.
cl_progress_indicator=>progress_indicate( i_text = |encoding objects &1% ( &2 of &3 )|
i_processed = lv_objects_processed
i_total = lv_objects_total ).
lv_xstring = type_and_length(
iv_type = <ls_object>-type
iv_length = xstrlen( <ls_object>-data ) ).
CONCATENATE rv_data lv_xstring INTO rv_data IN BYTE MODE.
cl_abap_gzip=>compress_binary(

View File

@ -15,6 +15,10 @@ CLASS lcl_html_action_utils DEFINITION FINAL.
IMPORTING iv_string TYPE clike
RETURNING VALUE(rt_fields) TYPE tihttpnvp.
CLASS-METHODS parse_fields_upper_case_name
IMPORTING iv_string TYPE clike
RETURNING VALUE(rt_fields) TYPE tihttpnvp.
CLASS-METHODS add_field
IMPORTING name TYPE string
iv TYPE any
@ -75,8 +79,8 @@ CLASS lcl_html_action_utils DEFINITION FINAL.
RETURNING VALUE(rs_content) TYPE lcl_persistence_db=>ty_content.
CLASS-METHODS parse_commit_request
IMPORTING it_postdata TYPE cnht_post_data_tab
EXPORTING es_fields TYPE any.
IMPORTING it_postdata TYPE cnht_post_data_tab
EXPORTING es_fields TYPE any.
CLASS-METHODS decode_bg_update
IMPORTING iv_getdata TYPE clike
@ -88,6 +92,11 @@ CLASS lcl_html_action_utils DEFINITION FINAL.
ev_seed TYPE string
RAISING lcx_exception.
PRIVATE SECTION.
CLASS-METHODS unescape
IMPORTING iv_string TYPE string
RETURNING VALUE(rv_string) TYPE string.
ENDCLASS. "lcl_html_action_utils DEFINITION
*----------------------------------------------------------------------*
@ -107,7 +116,43 @@ CLASS lcl_html_action_utils IMPLEMENTATION.
METHOD parse_fields.
rt_fields = cl_http_utility=>if_http_utility~string_to_fields( |{ iv_string }| ).
DATA: substrings TYPE stringtab,
field LIKE LINE OF rt_fields.
FIELD-SYMBOLS: <substring> LIKE LINE OF substrings.
SPLIT iv_string AT '&' INTO TABLE substrings.
LOOP AT substrings ASSIGNING <substring>.
CLEAR: field.
field-name = substring_before( val = <substring>
sub = '=' ).
field-name = unescape( field-name ).
field-value = substring_after( val = <substring>
sub = '=' ).
field-value = unescape( field-value ).
INSERT field INTO TABLE rt_fields.
ENDLOOP.
ENDMETHOD.
METHOD unescape.
* do not use cl_http_utility as it does strange things with the encoding
rv_string = iv_string.
* todo, more to be added here
REPLACE ALL OCCURRENCES OF '%3F' IN rv_string WITH '?'.
ENDMETHOD.
METHOD parse_fields_upper_case_name.
rt_fields = parse_fields( iv_string ).
field_keys_to_upper( CHANGING ct_fields = rt_fields ).
ENDMETHOD. " parse_fields.
@ -175,8 +220,7 @@ CLASS lcl_html_action_utils IMPLEMENTATION.
DATA: lt_fields TYPE tihttpnvp.
lt_fields = cl_http_utility=>if_http_utility~string_to_fields( |{ iv_string }| ).
lt_fields = lcl_html_action_utils=>parse_fields( iv_string ).
get_field( EXPORTING name = 'TYPE' it = lt_fields CHANGING cv = ev_obj_type ).
get_field( EXPORTING name = 'NAME' it = lt_fields CHANGING cv = ev_obj_name ).
@ -194,7 +238,8 @@ CLASS lcl_html_action_utils IMPLEMENTATION.
METHOD dir_decode.
DATA: lt_fields TYPE tihttpnvp.
lt_fields = cl_http_utility=>if_http_utility~string_to_fields( |{ iv_string }| ).
lt_fields = lcl_html_action_utils=>parse_fields( iv_string ).
get_field( EXPORTING name = 'PATH' it = lt_fields CHANGING cv = rv_path ).
ENDMETHOD. "dir_decode
@ -232,7 +277,7 @@ CLASS lcl_html_action_utils IMPLEMENTATION.
ASSERT eg_file IS SUPPLIED OR eg_object IS SUPPLIED.
CLEAR: ev_key, eg_file, eg_object.
lt_fields = parse_fields( iv_string ).
lt_fields = parse_fields_upper_case_name( iv_string ).
get_field( EXPORTING name = 'KEY' it = lt_fields CHANGING cv = ev_key ).
@ -263,7 +308,7 @@ CLASS lcl_html_action_utils IMPLEMENTATION.
DATA: lt_fields TYPE tihttpnvp.
lt_fields = parse_fields( iv_string ).
lt_fields = parse_fields_upper_case_name( cl_http_utility=>unescape_url( |{ iv_string }| ) ).
get_field( EXPORTING name = 'TYPE' it = lt_fields CHANGING cv = rs_key-type ).
get_field( EXPORTING name = 'VALUE' it = lt_fields CHANGING cv = rs_key-value ).
@ -277,9 +322,12 @@ CLASS lcl_html_action_utils IMPLEMENTATION.
CONCATENATE LINES OF it_postdata INTO lv_string.
lv_string = cl_http_utility=>unescape_url( lv_string ).
rs_content = dbkey_decode( lv_string ).
lt_fields = parse_fields( lv_string ).
lt_fields = parse_fields_upper_case_name( lv_string ).
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 ???
@ -304,7 +352,7 @@ CLASS lcl_html_action_utils IMPLEMENTATION.
CONCATENATE LINES OF it_postdata INTO lv_string.
REPLACE ALL OCCURRENCES OF lif_defs=>gc_crlf IN lv_string WITH lc_replace.
REPLACE ALL OCCURRENCES OF lif_defs=>gc_newline IN lv_string WITH lc_replace.
lt_fields = parse_fields( lv_string ).
lt_fields = parse_fields_upper_case_name( lv_string ).
get_field( EXPORTING name = 'COMMITTER_NAME' it = lt_fields CHANGING cv = es_fields ).
get_field( EXPORTING name = 'COMMITTER_EMAIL' it = lt_fields CHANGING cv = es_fields ).
@ -317,15 +365,13 @@ CLASS lcl_html_action_utils IMPLEMENTATION.
ASSERT <body> IS ASSIGNED.
REPLACE ALL OCCURRENCES OF lc_replace IN <body> WITH lif_defs=>gc_newline.
ASSERT es_fields IS NOT INITIAL.
ENDMETHOD. "parse_commit_request
METHOD decode_bg_update.
DATA: lt_fields TYPE tihttpnvp.
lt_fields = parse_fields( iv_getdata ).
lt_fields = parse_fields_upper_case_name( iv_getdata ).
get_field( EXPORTING name = 'METHOD' it = lt_fields CHANGING cv = rs_fields ).
get_field( EXPORTING name = 'USERNAME' it = lt_fields CHANGING cv = rs_fields ).
@ -342,7 +388,7 @@ CLASS lcl_html_action_utils IMPLEMENTATION.
DATA: lt_fields TYPE tihttpnvp.
lt_fields = parse_fields( iv_getdata ).
lt_fields = parse_fields_upper_case_name( iv_getdata ).
get_field( EXPORTING name = 'KEY' it = lt_fields CHANGING cv = ev_key ).
get_field( EXPORTING name = 'SEED' it = lt_fields CHANGING cv = ev_seed ).

View File

@ -501,8 +501,8 @@ CLASS lcl_http IMPLEMENTATION.
METHOD is_local_system.
DATA: lv_host TYPE string,
lt_list TYPE STANDARD TABLE OF icm_sinfo2 WITH DEFAULT KEY.
lt_list TYPE lif_defs=>ty_icm_sinfo2_tt,
li_exit TYPE ref to lif_exit.
CALL FUNCTION 'ICM_GET_INFO2'
TABLES
@ -516,6 +516,9 @@ CLASS lcl_http IMPLEMENTATION.
RETURN.
ENDIF.
li_exit = lcl_exit=>get_instance( ).
li_exit->change_local_host( CHANGING ct_hosts = lt_list ).
FIND REGEX 'https?://([^/^:]*)' IN iv_url
SUBMATCHES lv_host.

View File

@ -112,8 +112,13 @@ CLASS lcl_news IMPLEMENTATION.
lv_last_seen = lcl_app=>user( )->get_repo_last_change_seen( lv_url ).
" Find changelog
lt_remote = io_repo->get_files_remote( ).
TRY.
" Find changelog
lt_remote = io_repo->get_files_remote( ).
CATCH lcx_exception.
RETURN.
ENDTRY.
READ TABLE lt_remote ASSIGNING <file>
WITH KEY path = lc_log_path filename = lc_log_filename.

View File

@ -18,32 +18,27 @@ CLASS lcl_object_clas DEFINITION INHERITING FROM lcl_objects_program.
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.
DATA mo_object_oriented_object_fct TYPE REF TO lif_oo_object_fnc.
PRIVATE SECTION.
DATA mv_skip_testclass TYPE abap_bool.
METHODS deserialize_tpool
IMPORTING io_xml TYPE REF TO lcl_xml_input
RAISING lcx_exception.
METHODS deserialize_sotr
IMPORTING io_xml TYPE REF TO lcl_xml_input
iv_package TYPE devclass
RAISING lcx_exception.
METHODS serialize_xml
IMPORTING io_xml TYPE REF TO lcl_xml_output
RAISING lcx_exception.
DATA: mo_object_oriented_object_fct TYPE REF TO lif_oo_object_fnc,
mv_skip_testclass TYPE abap_bool.
METHODS:
deserialize_abap
IMPORTING io_xml TYPE REF TO lcl_xml_input
iv_package TYPE devclass
RAISING lcx_exception,
deserialize_docu
IMPORTING io_xml TYPE REF TO lcl_xml_input
RAISING lcx_exception,
deserialize_tpool
IMPORTING io_xml TYPE REF TO lcl_xml_input
RAISING lcx_exception,
deserialize_sotr
IMPORTING io_xml TYPE REF TO lcl_xml_input
iv_package TYPE devclass
RAISING lcx_exception,
serialize_xml
IMPORTING io_xml TYPE REF TO lcl_xml_output
RAISING lcx_exception.
ENDCLASS. "lcl_object_dtel DEFINITION
@ -366,6 +361,7 @@ CLASS lcl_object_clas IMPLEMENTATION.
iv_package = iv_package
CHANGING
is_properties = ls_vseoclass ).
mo_object_oriented_object_fct->generate_locals(
is_key = ls_class_key
iv_force = seox_true
@ -375,8 +371,8 @@ CLASS lcl_object_clas IMPLEMENTATION.
it_local_test_classes = lt_test_classes ).
mo_object_oriented_object_fct->deserialize_source(
is_key = ls_class_key
it_source = lt_source ).
is_key = ls_class_key
it_source = lt_source ).
io_xml->read( EXPORTING iv_name = 'DESCRIPTIONS'
CHANGING cg_data = lt_descriptions ).
@ -385,7 +381,7 @@ CLASS lcl_object_clas IMPLEMENTATION.
is_key = ls_class_key
it_descriptions = lt_descriptions ).
mo_object_oriented_object_fct->add_to_activation_list( is_item = ms_item ).
mo_object_oriented_object_fct->add_to_activation_list( ms_item ).
ENDMETHOD. "deserialize
METHOD lif_object~compare_to_remote_version.
@ -396,7 +392,7 @@ CLASS lcl_object_clas IMPLEMENTATION.
super->constructor(
is_item = is_item
iv_language = iv_language ).
mo_object_oriented_object_fct = lcl_oo_factory=>make( iv_object_type = ms_item-obj_type ).
mo_object_oriented_object_fct = lcl_oo_factory=>make( ms_item-obj_type ).
ENDMETHOD.
ENDCLASS. "lcl_object_CLAS IMPLEMENTATION
@ -457,8 +453,9 @@ CLASS lcl_oo_class IMPLEMENTATION.
lcx_exception=>raise( 'error from generate_locals' ).
ENDIF.
ENDMETHOD.
METHOD lif_oo_object_fnc~insert_text_pool.
DATA: lv_cp TYPE program.
DATA: lv_cp TYPE program.
lv_cp = cl_oo_classname_service=>get_classpool_name( iv_class_name ).

View File

@ -0,0 +1,412 @@
*&---------------------------------------------------------------------*
*& Include ZABAPGIT_OBJECT_CLAS_NEW
*&---------------------------------------------------------------------*
* todo: refactoring
* todo: testing, possible from master branch via experimental switch
CLASS lcl_oo_class_new DEFINITION INHERITING FROM lcl_oo_class.
PUBLIC SECTION.
METHODS:
lif_oo_object_fnc~create REDEFINITION,
lif_oo_object_fnc~generate_locals REDEFINITION,
lif_oo_object_fnc~deserialize_source REDEFINITION.
PRIVATE SECTION.
CLASS-METHODS:
update_report
IMPORTING
iv_program TYPE programm
it_source TYPE string_table
RETURNING
VALUE(rv_updated) TYPE abap_bool,
generate_classpool
IMPORTING
iv_name TYPE seoclsname
RAISING
lcx_exception,
update_meta
IMPORTING
iv_name TYPE seoclsname
iv_exposure TYPE seoexpose
it_source TYPE rswsourcet
RAISING
lcx_exception,
determine_method_include
IMPORTING
iv_name TYPE seoclsname
iv_method TYPE seocpdname
RETURNING
VALUE(rv_program) TYPE programm
RAISING
lcx_exception,
init_scanner
IMPORTING
it_source TYPE lif_defs=>ty_string_tt
iv_name TYPE seoclsname
RETURNING
VALUE(ro_scanner) TYPE REF TO cl_oo_source_scanner_class.
ENDCLASS.
CLASS lcl_oo_class_new IMPLEMENTATION.
METHOD determine_method_include.
DATA: ls_mtdkey TYPE seocpdkey.
ls_mtdkey-clsname = iv_name.
ls_mtdkey-cpdname = iv_method.
cl_oo_classname_service=>get_method_include(
EXPORTING
mtdkey = ls_mtdkey
RECEIVING
result = rv_program
EXCEPTIONS
method_not_existing = 1 ).
IF sy-subrc = 0.
RETURN.
ENDIF.
CALL FUNCTION 'SEO_METHOD_GENERATE_INCLUDE'
EXPORTING
suppress_mtdkey_check = seox_true
mtdkey = ls_mtdkey
EXCEPTIONS
not_existing = 1
model_only = 2
include_existing = 3
method_imp_not_generated = 4
method_imp_not_initialised = 5
_internal_class_not_existing = 6
_internal_method_overflow = 7
cancelled = 8
method_is_abstract_implemented = 9
method_is_final_implemented = 10
internal_error_insert_report = 11
OTHERS = 12.
IF sy-subrc <> 0.
lcx_exception=>raise( 'error from SEO_METHOD_GENERATE_INCLUDE' ).
ENDIF.
rv_program = cl_oo_classname_service=>get_method_include( ls_mtdkey ).
ENDMETHOD.
METHOD lif_oo_object_fnc~create.
* same as in super class, but with "version = seoc_version_active"
CALL FUNCTION 'SEO_CLASS_CREATE_COMPLETE'
EXPORTING
devclass = iv_package
overwrite = iv_overwrite
version = seoc_version_active
CHANGING
class = is_properties
EXCEPTIONS
existing = 1
is_interface = 2
db_error = 3
component_error = 4
no_access = 5
other = 6
OTHERS = 7.
IF sy-subrc <> 0.
lcx_exception=>raise( 'error from SEO_CLASS_CREATE_COMPLETE' ).
ENDIF.
ENDMETHOD.
METHOD init_scanner.
ro_scanner = cl_oo_source_scanner_class=>create_class_scanner(
clif_name = iv_name
source = it_source ).
ro_scanner->scan( ).
ENDMETHOD.
METHOD update_report.
DATA: lt_old TYPE string_table.
READ REPORT iv_program INTO lt_old.
ASSERT sy-subrc = 0. " include should have been created previously
IF lt_old <> it_source.
INSERT REPORT iv_program FROM it_source.
ASSERT sy-subrc = 0.
rv_updated = abap_true.
ELSE.
rv_updated = abap_false.
ENDIF.
ENDMETHOD.
METHOD lif_oo_object_fnc~generate_locals.
DATA: lv_program TYPE programm.
lv_program = cl_oo_classname_service=>get_ccdef_name( is_key-clsname ).
update_report( iv_program = lv_program
it_source = it_local_definitions ).
lv_program = cl_oo_classname_service=>get_ccimp_name( is_key-clsname ).
update_report( iv_program = lv_program
it_source = it_local_implementations ).
lv_program = cl_oo_classname_service=>get_ccmac_name( is_key-clsname ).
update_report( iv_program = lv_program
it_source = it_local_macros ).
IF lines( it_local_test_classes ) > 0.
lv_program = cl_oo_classname_service=>get_ccau_name( is_key-clsname ).
update_report( iv_program = lv_program
it_source = it_local_test_classes ).
ENDIF.
ENDMETHOD.
METHOD update_meta.
DATA: lo_update TYPE REF TO cl_oo_class_section_source,
ls_clskey TYPE seoclskey,
lv_scan_error TYPE seox_boolean.
ls_clskey-clsname = iv_name.
CREATE OBJECT lo_update
EXPORTING
clskey = ls_clskey
exposure = iv_exposure
state = 'A'
source = it_source
suppress_constrctr_generation = seox_true
EXCEPTIONS
class_not_existing = 1
read_source_error = 2
OTHERS = 3.
IF sy-subrc <> 0.
lcx_exception=>raise( 'error instantiating CL_OO_CLASS_SECTION_SOURCE' ).
ENDIF.
lo_update->set_dark_mode( seox_true ).
TRY.
CALL METHOD lo_update->('SET_AMDP_SUPPORT')
EXPORTING
enabled = abap_true.
CATCH cx_sy_dyn_call_illegal_method.
* AMDP not supported in this system, ignore error
ENDTRY.
lo_update->scan_section_source(
RECEIVING
scan_error = lv_scan_error
EXCEPTIONS
scan_abap_source_error = 1
OTHERS = 2 ).
IF sy-subrc <> 0 OR lv_scan_error = abap_true.
lcx_exception=>raise( 'CLAS, error while scanning source' ).
ENDIF.
* this will update the SEO* database tables
lo_update->revert_scan_result( ).
IF iv_exposure = seoc_exposure_public.
generate_classpool( iv_name ).
ENDIF.
ENDMETHOD.
METHOD generate_classpool.
DATA: ls_clskey TYPE seoclskey.
ls_clskey-clsname = iv_name.
CALL FUNCTION 'SEO_CLASS_GENERATE_CLASSPOOL'
EXPORTING
clskey = ls_clskey
suppress_corr = seox_true
EXCEPTIONS
not_existing = 1
model_only = 2
class_pool_not_generated = 3
class_stment_not_generated = 4
locals_not_generated = 5
macros_not_generated = 6
public_sec_not_generated = 7
protected_sec_not_generated = 8
private_sec_not_generated = 9
typeref_not_generated = 10
class_pool_not_initialised = 11
class_stment_not_initialised = 12
locals_not_initialised = 13
macros_not_initialised = 14
public_sec_not_initialised = 15
protected_sec_not_initialised = 16
private_sec_not_initialised = 17
typeref_not_initialised = 18
_internal_class_overflow = 19
OTHERS = 20.
IF sy-subrc <> 0.
lcx_exception=>raise( 'error from SEO_CLASS_GENERATE_CLASSPOOL' ).
ENDIF.
ENDMETHOD.
METHOD lif_oo_object_fnc~deserialize_source.
DATA: lv_updated TYPE abap_bool,
lv_program TYPE program,
lo_scanner TYPE REF TO cl_oo_source_scanner_class,
lt_methods TYPE cl_oo_source_scanner_class=>type_method_implementations,
lv_method LIKE LINE OF lt_methods,
lt_source TYPE seop_source_string.
lo_scanner = init_scanner(
it_source = it_source
iv_name = is_key-clsname ).
* public
lt_source = lo_scanner->get_public_section_source( ).
lv_program = cl_oo_classname_service=>get_pubsec_name( is_key-clsname ).
lv_updated = update_report( iv_program = lv_program
it_source = lt_source ).
IF lv_updated = abap_true.
update_meta( iv_name = is_key-clsname
iv_exposure = seoc_exposure_public
it_source = lt_source ).
ENDIF.
* protected
lt_source = lo_scanner->get_protected_section_source( ).
lv_program = cl_oo_classname_service=>get_prosec_name( is_key-clsname ).
lv_updated = update_report( iv_program = lv_program
it_source = lt_source ).
IF lv_updated = abap_true.
update_meta( iv_name = is_key-clsname
iv_exposure = seoc_exposure_protected
it_source = lt_source ).
ENDIF.
* private
lt_source = lo_scanner->get_private_section_source( ).
lv_program = cl_oo_classname_service=>get_prisec_name( is_key-clsname ).
lv_updated = update_report( iv_program = lv_program
it_source = lt_source ).
IF lv_updated = abap_true.
update_meta( iv_name = is_key-clsname
iv_exposure = seoc_exposure_private
it_source = lt_source ).
ENDIF.
* methods
lt_methods = lo_scanner->get_method_implementations( ).
LOOP AT lt_methods INTO lv_method.
TRY.
lt_source = lo_scanner->get_method_impl_source( lv_method ).
CATCH cx_oo_clif_component.
lcx_exception=>raise( 'error from GET_METHOD_IMPL_SOURCE' ).
ENDTRY.
lv_program = determine_method_include(
iv_name = is_key-clsname
iv_method = lv_method ).
update_report(
iv_program = lv_program
it_source = lt_source ).
ENDLOOP.
ENDMETHOD.
ENDCLASS.
CLASS lcl_object_clas_new DEFINITION INHERITING FROM lcl_object_clas.
PUBLIC SECTION.
METHODS: constructor
IMPORTING
is_item TYPE lif_defs=>ty_item
iv_language TYPE spras.
PROTECTED SECTION.
METHODS:
deserialize_abap REDEFINITION.
ENDCLASS.
CLASS lcl_object_clas_new IMPLEMENTATION.
METHOD constructor.
super->constructor( is_item = is_item
iv_language = iv_language ).
CREATE OBJECT mo_object_oriented_object_fct TYPE lcl_oo_class_new.
ENDMETHOD.
METHOD deserialize_abap.
* same as in lcl_object_clas, but without "mo_object_oriented_object_fct->add_to_activation_list"
DATA: ls_vseoclass TYPE vseoclass,
lt_source TYPE seop_source_string,
lt_local_definitions TYPE seop_source_string,
lt_local_implementations TYPE seop_source_string,
lt_local_macros TYPE seop_source_string,
lt_test_classes TYPE seop_source_string,
lt_descriptions TYPE lif_defs=>ty_seocompotx_tt,
ls_class_key TYPE seoclskey.
lt_source = mo_files->read_abap( ).
lt_local_definitions = mo_files->read_abap( iv_extra = 'locals_def'
iv_error = abap_false ). "#EC NOTEXT
lt_local_implementations = mo_files->read_abap( iv_extra = 'locals_imp'
iv_error = abap_false ). "#EC NOTEXT
lt_local_macros = mo_files->read_abap( iv_extra = 'macros'
iv_error = abap_false ). "#EC NOTEXT
lt_test_classes = mo_files->read_abap( iv_extra = 'testclasses'
iv_error = abap_false ). "#EC NOTEXT
ls_class_key-clsname = ms_item-obj_name.
io_xml->read( EXPORTING iv_name = 'VSEOCLASS'
CHANGING cg_data = ls_vseoclass ).
mo_object_oriented_object_fct->create(
EXPORTING
iv_package = iv_package
CHANGING
is_properties = ls_vseoclass ).
mo_object_oriented_object_fct->generate_locals(
is_key = ls_class_key
iv_force = seox_true
it_local_definitions = lt_local_definitions
it_local_implementations = lt_local_implementations
it_local_macros = lt_local_macros
it_local_test_classes = lt_test_classes ).
mo_object_oriented_object_fct->deserialize_source(
is_key = ls_class_key
it_source = lt_source ).
io_xml->read( EXPORTING iv_name = 'DESCRIPTIONS'
CHANGING cg_data = lt_descriptions ).
mo_object_oriented_object_fct->update_descriptions(
is_key = ls_class_key
it_descriptions = lt_descriptions ).
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_CLAS_NEW</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_CLAS_NEW</ENTRY>
<LENGTH>32</LENGTH>
</item>
</TPOOL>
</asx:values>
</asx:abap>
</abapGit>

View File

@ -0,0 +1,213 @@
*&---------------------------------------------------------------------*
*& Include ZABAPGIT_OBJECT_CMPT
*&---------------------------------------------------------------------*
CLASS lcl_object_cmpt DEFINITION INHERITING FROM lcl_objects_super FINAL.
PUBLIC SECTION.
METHODS:
constructor
IMPORTING
is_item TYPE lif_defs=>ty_item
iv_language TYPE spras.
INTERFACES lif_object.
PRIVATE SECTION.
DATA: mo_cmp_db TYPE REF TO object.
ENDCLASS.
CLASS lcl_object_cmpt IMPLEMENTATION.
METHOD constructor.
super->constructor( is_item = is_item
iv_language = iv_language ).
TRY.
CALL METHOD ('CL_CMP_TEMPLATE')=>('S_GET_DB_ACCESS')
RECEIVING
r_ref_db_access = mo_cmp_db.
CATCH cx_root.
ENDTRY.
ENDMETHOD.
METHOD lif_object~has_changed_since.
rv_changed = abap_true.
ENDMETHOD.
METHOD lif_object~changed_by.
DATA: mi_cmp_template TYPE REF TO object.
TRY.
CALL METHOD ('CL_CMP_TEMPLATE')=>('S_CREATE_FROM_DB')
EXPORTING
i_name = |{ ms_item-obj_name }|
i_version = 'A'
RECEIVING
r_ref_template = mi_cmp_template.
CALL METHOD mi_cmp_template->('IF_CMP_TEMPLATE_EDIT~GET_CHANGE_USER')
RECEIVING
r_user = rv_user.
CATCH cx_root.
lcx_exception=>raise( 'CMPT not supported' ).
ENDTRY.
ENDMETHOD.
METHOD lif_object~get_metadata.
rs_metadata = get_metadata( ).
rs_metadata-delete_tadir = abap_true.
ENDMETHOD.
METHOD lif_object~exists.
DATA: name TYPE c LENGTH 30.
name = ms_item-obj_name.
TRY.
CALL METHOD ('CL_CMP_TEMPLATE')=>('S_TEMPLATE_EXISTS')
EXPORTING
i_name = name
i_version = 'A'
RECEIVING
r_flg_exists = rv_bool.
CATCH cx_root.
lcx_exception=>raise( 'CMPT not supported' ).
ENDTRY.
ENDMETHOD.
METHOD lif_object~serialize.
DATA: lr_template TYPE REF TO data.
FIELD-SYMBOLS: <template> TYPE any.
TRY.
CREATE DATA lr_template TYPE ('IF_CMP_TEMPLATE_DB=>TYP_TEMPLATE').
ASSIGN lr_template->* TO <template>.
CALL METHOD mo_cmp_db->('IF_CMP_TEMPLATE_DB~READ_TEMPLATE')
EXPORTING
i_name = |{ ms_item-obj_name }|
i_version = 'A'
RECEIVING
r_template = <template>.
io_xml->add( iv_name = 'CMPT'
ig_data = <template> ).
CATCH cx_root.
lcx_exception=>raise( 'CMPT not supported' ).
ENDTRY.
ENDMETHOD.
METHOD lif_object~deserialize.
DATA: lr_template TYPE REF TO data.
FIELD-SYMBOLS: <template> TYPE any.
TRY.
CREATE DATA lr_template TYPE ('IF_CMP_TEMPLATE_DB=>TYP_TEMPLATE').
ASSIGN lr_template->* TO <template>.
io_xml->read(
EXPORTING
iv_name = 'CMPT'
CHANGING
cg_data = <template> ).
CALL METHOD mo_cmp_db->('IF_CMP_TEMPLATE_DB~SAVE_TEMPLATE')
EXPORTING
i_template_db = <template>
i_flg_header = abap_true
i_flg_lines = abap_true.
CATCH cx_root.
lcx_exception=>raise( 'CMPT not supported' ).
ENDTRY.
CALL FUNCTION 'RS_CORR_INSERT'
EXPORTING
object = ms_item-obj_name
object_class = ms_item-obj_type
mode = 'I'
global_lock = abap_true
devclass = iv_package
master_language = mv_language
EXCEPTIONS
cancelled = 1
permission_failure = 2
unknown_objectclass = 3
OTHERS = 4.
IF sy-subrc <> 0.
lcx_exception=>raise( 'error from RS_CORR_INSERT, CMPT' ).
ENDIF.
ENDMETHOD.
METHOD lif_object~delete.
DATA: deleted TYPE abap_bool.
TRY.
CALL METHOD mo_cmp_db->('IF_CMP_TEMPLATE_DB~DELETE_TEMPLATE')
EXPORTING
i_name = |{ ms_item-obj_name }|
i_version = 'A'
i_flg_header = abap_true
i_flg_lines = abap_true
RECEIVING
r_flg_deleted = deleted.
CATCH cx_root.
lcx_exception=>raise( 'CMPT not supported' ).
ENDTRY.
IF deleted = abap_false.
lcx_exception=>raise( |Error deleting CMPT { ms_item-obj_name }| ).
ENDIF.
ENDMETHOD.
METHOD lif_object~jump.
CALL FUNCTION 'RS_TOOL_ACCESS'
EXPORTING
operation = 'SHOW'
object_name = ms_item-obj_name
object_type = ms_item-obj_type
EXCEPTIONS
not_executed = 1
invalid_object_type = 2
OTHERS = 3.
IF sy-subrc <> 0.
lcx_exception=>raise( |Error from RS_TOOL_ACCESS, CMPT| ).
ENDIF.
ENDMETHOD.
METHOD lif_object~compare_to_remote_version.
CREATE OBJECT ro_comparison_result TYPE lcl_comparison_null.
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_CMPT</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_CMPT</ENTRY>
<LENGTH>28</LENGTH>
</item>
</TPOOL>
</asx:values>
</asx:abap>
</abapGit>

View File

@ -32,8 +32,42 @@ CLASS lcl_object_ddls IMPLEMENTATION.
ENDMETHOD. "lif_object~has_changed_since
METHOD lif_object~changed_by.
* todo
rv_user = c_user_unknown.
DATA: lv_state TYPE objstate,
li_ddl TYPE REF TO object,
lr_data TYPE REF TO data.
FIELD-SYMBOLS: <ls_data> TYPE any,
<lv_field> TYPE any.
CREATE DATA lr_data TYPE ('DDDDLSRCV').
ASSIGN lr_data->* TO <ls_data>.
CALL METHOD ('CL_DD_DDL_HANDLER_FACTORY')=>('CREATE')
RECEIVING
handler = li_ddl.
TRY.
CALL METHOD li_ddl->('IF_DD_DDL_HANDLER~READ')
EXPORTING
name = ms_item-obj_name
get_state = 'A'
IMPORTING
ddddlsrcv_wa = <ls_data>.
ASSIGN COMPONENT 'AS4USER' OF STRUCTURE <ls_data> TO <lv_field>.
IF sy-subrc = 0.
rv_user = <lv_field>.
ENDIF.
CATCH cx_root.
ENDTRY.
IF rv_user IS INITIAL.
rv_user = c_user_unknown.
ENDIF.
ENDMETHOD. "lif_object~changed_by
METHOD lif_object~get_metadata.
@ -108,7 +142,7 @@ CLASS lcl_object_ddls IMPLEMENTATION.
EXPORTING
name = ms_item-obj_name.
CATCH cx_root.
lcx_exception=>raise( 'DDLS error' ).
lcx_exception=>raise( 'DDLS error deleting' ).
ENDTRY.
ENDMETHOD. "delete
@ -137,7 +171,7 @@ CLASS lcl_object_ddls IMPLEMENTATION.
IMPORTING
ddddlsrcv_wa = <ls_data>.
CATCH cx_root.
lcx_exception=>raise( 'DDLS error' ).
lcx_exception=>raise( 'DDLS error reading' ).
ENDTRY.
ASSIGN COMPONENT 'AS4USER' OF STRUCTURE <ls_data> TO <lv_field>.
@ -199,7 +233,7 @@ CLASS lcl_object_ddls IMPLEMENTATION.
devclass = iv_package
prid = 0.
CATCH cx_root.
lcx_exception=>raise( 'DDLS error' ).
lcx_exception=>raise( 'DDLS error writing TADIR' ).
ENDTRY.
lcl_objects_activation=>add_item( ms_item ).

View File

@ -0,0 +1,205 @@
*&---------------------------------------------------------------------*
*& Include zabapgit_object_dial
*&---------------------------------------------------------------------*
CLASS lcl_object_dial DEFINITION INHERITING FROM lcl_objects_super FINAL.
PUBLIC SECTION.
INTERFACES lif_object.
PRIVATE SECTION.
TYPES: BEGIN OF ty_dialog_module,
tdct TYPE tdct,
dia_pars TYPE STANDARD TABLE OF diapar
WITH NON-UNIQUE DEFAULT KEY,
END OF ty_dialog_module.
METHODS:
_read_tdct
RETURNING
VALUE(rs_tdct) TYPE tdct.
ENDCLASS.
CLASS lcl_object_dial IMPLEMENTATION.
METHOD lif_object~has_changed_since.
rv_changed = abap_true.
ENDMETHOD.
METHOD lif_object~changed_by.
rv_user = c_user_unknown.
ENDMETHOD.
METHOD lif_object~get_metadata.
rs_metadata = get_metadata( ).
ENDMETHOD.
METHOD lif_object~exists.
DATA: ls_tdct TYPE tdct.
ls_tdct = _read_tdct( ).
rv_bool = boolc( ls_tdct IS NOT INITIAL ).
ENDMETHOD.
METHOD lif_object~serialize.
DATA: ls_dialog_module TYPE ty_dialog_module.
ls_dialog_module-tdct = _read_tdct( ).
SELECT * FROM diapar
INTO TABLE ls_dialog_module-dia_pars
WHERE dnam = ls_dialog_module-tdct-dnam.
io_xml->add( iv_name = 'DIAL'
ig_data = ls_dialog_module ).
ENDMETHOD.
METHOD lif_object~deserialize.
DATA: ls_dialog_module TYPE ty_dialog_module.
io_xml->read(
EXPORTING
iv_name = 'DIAL'
CHANGING
cg_data = ls_dialog_module ).
CALL FUNCTION 'RS_DIALOG_CREATE'
EXPORTING
dialogname = ls_dialog_module-tdct-dnam
dynpronumber = ls_dialog_module-tdct-dynr
programname = ls_dialog_module-tdct-prog
suppress_corr_check = abap_false
* It seems that dia_par parameter doesn't do anything, but we can't omit it
* Parameters are inserted below
TABLES
dia_par = ls_dialog_module-dia_pars
EXCEPTIONS
dialog_already_exists = 1
invalid_name = 2
OTHERS = 3.
IF sy-subrc <> 0.
lcx_exception=>raise( |Error deserializing dialogmodule { ms_item-obj_name }| ).
ENDIF.
" It seems that there's no API for diapar, therefore we manipulate it directly
INSERT diapar FROM TABLE ls_dialog_module-dia_pars.
ENDMETHOD.
METHOD lif_object~delete.
DATA: ls_bcdata TYPE bdcdata,
lt_bcdata TYPE STANDARD TABLE OF bdcdata.
ls_bcdata-program = 'SAPMSDIA'.
ls_bcdata-dynpro = '1010'.
ls_bcdata-dynbegin = 'X'.
APPEND ls_bcdata TO lt_bcdata.
CLEAR ls_bcdata.
ls_bcdata-fnam = 'DIAPAR-DNAM'.
ls_bcdata-fval = ms_item-obj_name.
APPEND ls_bcdata TO lt_bcdata.
CLEAR ls_bcdata.
ls_bcdata-fnam = 'RS38L-PARM'.
ls_bcdata-fval = abap_true.
APPEND ls_bcdata TO lt_bcdata.
CLEAR ls_bcdata.
ls_bcdata-fnam = 'BDC_OKCODE'.
ls_bcdata-fval = '=DELF'.
APPEND ls_bcdata TO lt_bcdata.
CLEAR ls_bcdata.
ls_bcdata-program = 'SAPLSPO1'.
ls_bcdata-dynpro = '0100'.
ls_bcdata-dynbegin = 'X'.
APPEND ls_bcdata TO lt_bcdata.
CLEAR ls_bcdata.
ls_bcdata-fnam = 'BDC_OKCODE'.
ls_bcdata-fval = '=YES'.
APPEND ls_bcdata TO lt_bcdata.
ls_bcdata-program = 'SAPMSDIA'.
ls_bcdata-dynpro = '1010'.
ls_bcdata-dynbegin = 'X'.
APPEND ls_bcdata TO lt_bcdata.
CLEAR ls_bcdata.
ls_bcdata-fnam = 'BDC_OKCODE'.
ls_bcdata-fval = '=BACK'.
APPEND ls_bcdata TO lt_bcdata.
CALL FUNCTION 'ABAP4_CALL_TRANSACTION'
EXPORTING
tcode = 'SE35'
mode_val = 'E'
TABLES
using_tab = lt_bcdata
EXCEPTIONS
OTHERS = 1.
IF sy-subrc <> 0.
lcx_exception=>raise( 'error from ABAP4_CALL_TRANSACTION, SE35' ).
ENDIF.
ENDMETHOD.
METHOD lif_object~jump.
DATA: objectname TYPE tdct-dnam.
objectname = ms_item-obj_name.
CALL FUNCTION 'RS_DIALOG_SHOW'
EXPORTING
objectname = objectname
type = 'VW'
EXCEPTIONS
object_not_found = 1
OTHERS = 2.
IF sy-subrc <> 0.
lcx_exception=>raise( |Error from RS_DIALOG_SHOW, DIAL| ).
ENDIF.
ENDMETHOD.
METHOD lif_object~compare_to_remote_version.
CREATE OBJECT ro_comparison_result TYPE lcl_comparison_null.
ENDMETHOD.
METHOD _read_tdct.
DATA: dnam TYPE tdct-dnam.
dnam = ms_item-obj_name.
SELECT SINGLE * FROM tdct
INTO rs_tdct
WHERE dnam = dnam.
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_DIAL</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_object_dial</ENTRY>
<LENGTH>20</LENGTH>
</item>
</TPOOL>
</asx:values>
</asx:abap>
</abapGit>

View File

@ -21,7 +21,7 @@ CLASS lcl_object_doct DEFINITION INHERITING FROM lcl_objects_super FINAL.
END OF ty_data.
METHODS: read
RETURNING value(rs_data) TYPE ty_data.
RETURNING VALUE(rs_data) TYPE ty_data.
ENDCLASS. "lcl_object_msag DEFINITION
@ -65,6 +65,9 @@ CLASS lcl_object_doct IMPLEMENTATION.
METHOD lif_object~changed_by.
rv_user = read( )-head-tdluser.
IF rv_user IS INITIAL.
rv_user = c_user_unknown.
ENDIF.
ENDMETHOD. "lif_object~changed_by
METHOD lif_object~exists.
@ -85,7 +88,48 @@ CLASS lcl_object_doct IMPLEMENTATION.
METHOD lif_object~jump.
lcx_exception=>raise( 'todo, jump DOCT' ).
DATA: ls_dokentry TYPE dokentry,
ls_bcdata TYPE bdcdata,
lt_bcdata TYPE STANDARD TABLE OF bdcdata.
" We need to modify dokentry directly, otherwise
" Batch Input on SE61 wouldn't work because it stores
" the last seen Document Class in this table. There's
" no standard function to do this. SE61 does this
" directly in its dialog modules
ls_dokentry-username = sy-uname.
ls_dokentry-langu = sy-langu.
ls_dokentry-class = c_id.
MODIFY dokentry FROM ls_dokentry.
ls_bcdata-program = 'SAPMSDCU'.
ls_bcdata-dynpro = '0100'.
ls_bcdata-dynbegin = 'X'.
APPEND ls_bcdata TO lt_bcdata.
CLEAR ls_bcdata.
ls_bcdata-fnam = 'RSDCU-OBJECT7'.
ls_bcdata-fval = ms_item-obj_name.
APPEND ls_bcdata TO lt_bcdata.
CLEAR ls_bcdata.
ls_bcdata-fnam = 'BDC_OKCODE'.
ls_bcdata-fval = '=SHOW'.
APPEND ls_bcdata TO lt_bcdata.
CALL FUNCTION 'ABAP4_CALL_TRANSACTION'
STARTING NEW TASK 'GIT'
EXPORTING
tcode = 'SE61'
mode_val = 'E'
TABLES
using_tab = lt_bcdata
EXCEPTIONS
OTHERS = 1.
IF sy-subrc <> 0.
lcx_exception=>raise( 'error from ABAP4_CALL_TRANSACTION, DOCT' ).
ENDIF.
ENDMETHOD. "jump

View File

@ -87,7 +87,7 @@ CLASS lcl_object_docv IMPLEMENTATION.
METHOD lif_object~jump.
lcx_exception=>raise( 'todo, jump DOCT' ).
lcx_exception=>raise( 'todo, jump DOCV' ).
ENDMETHOD. "jump

View File

@ -168,6 +168,10 @@ CLASS lcl_object_doma IMPLEMENTATION.
CLEAR ls_dd01v-masklen.
ENDIF.
SORT lt_dd07v BY
valpos ASCENDING
ddlanguage ASCENDING.
io_xml->add( iv_name = 'DD01V'
ig_data = ls_dd01v ).
io_xml->add( iv_name = 'DD07V_TAB'
@ -278,7 +282,7 @@ CLASS lcl_object_doma IMPLEMENTATION.
SORT lt_i18n_langs ASCENDING.
SORT lt_dd01_texts BY ddlanguage ASCENDING.
SORT lt_dd07_texts BY ddlanguage ASCENDING.
SORT lt_dd07_texts BY valpos ASCENDING ddlanguage ASCENDING.
IF lines( lt_i18n_langs ) > 0.
io_xml->add( iv_name = 'I18N_LANGS'

View File

@ -154,7 +154,7 @@ CLASS lcl_object_dtel IMPLEMENTATION.
ON tparat~paramid = tpara~paramid AND
tparat~sprache = mv_language
INTO ls_tpara
WHERE tpara~paramid = ls_dd04v-memoryid.
WHERE tpara~paramid = ls_dd04v-memoryid. "#EC CI_BUFFJOIN
ENDIF.
CLEAR: ls_dd04v-as4user,

View File

@ -131,6 +131,133 @@ CLASS lcl_object_enho_wdyc IMPLEMENTATION.
ENDCLASS. "lcl_object_enho_wdyconf IMPLEMENTATION
*----------------------------------------------------------------------*
* CLASS lcl_object_enho_wdyconf DEFINITION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS lcl_object_enho_wdyn DEFINITION.
PUBLIC SECTION.
METHODS: constructor
IMPORTING
is_item TYPE lif_defs=>ty_item
io_files TYPE REF TO lcl_objects_files.
INTERFACES: lif_object_enho.
PRIVATE SECTION.
DATA: ms_item TYPE lif_defs=>ty_item,
mo_files TYPE REF TO lcl_objects_files.
ENDCLASS. "lcl_object_enho_wdyconf DEFINITION
*----------------------------------------------------------------------*
* CLASS lcl_object_enho_wdyconf IMPLEMENTATION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS lcl_object_enho_wdyn IMPLEMENTATION.
METHOD constructor.
ms_item = is_item.
mo_files = io_files.
ENDMETHOD. "constructor
METHOD lif_object_enho~deserialize.
DATA: ls_enh_data TYPE enhwdyn,
li_tool TYPE REF TO if_enh_tool,
lo_wdyn TYPE REF TO cl_enh_tool_wdy,
tool_type TYPE enhtooltype,
package TYPE devclass.
FIELD-SYMBOLS: <controller_data> TYPE enhwdyc,
<view_data> TYPE enhwdyv.
io_xml->read(
EXPORTING
iv_name = 'TOOL'
CHANGING
cg_data = tool_type ).
io_xml->read(
EXPORTING
iv_name = 'COMPONENT_DATA'
CHANGING
cg_data = ls_enh_data ).
package = iv_package.
TRY.
cl_enh_factory=>create_enhancement(
EXPORTING
enhname = |{ ms_item-obj_name }|
enhtype = ''
enhtooltype = tool_type
IMPORTING
enhancement = li_tool
CHANGING
devclass = package ).
lo_wdyn ?= li_tool.
lo_wdyn->initialize( ls_enh_data-component_name ).
lo_wdyn->set_component_data( ls_enh_data-component_data ).
LOOP AT ls_enh_data-controller_data ASSIGNING <controller_data>.
lo_wdyn->set_controller_data( p_controller_name = <controller_data>-controller_name
p_enh_data = <controller_data> ).
ENDLOOP.
LOOP AT ls_enh_data-view_data ASSIGNING <view_data>.
lo_wdyn->set_view_data( p_view_name = <view_data>-view_name
p_enh_data = <view_data> ).
ENDLOOP.
lo_wdyn->if_enh_object~save( ).
lo_wdyn->if_enh_object~unlock( ).
CATCH cx_root.
lcx_exception=>raise( |error deserializing ENHO wdyn { ms_item-obj_name }| ).
ENDTRY.
ENDMETHOD. "lif_object_enho~deserialize
METHOD lif_object_enho~serialize.
DATA: lo_wdyn TYPE REF TO cl_enh_tool_wdy,
component_name TYPE wdy_component_name,
ls_enh_data TYPE enhwdyn.
lo_wdyn ?= ii_enh_tool.
component_name = lo_wdyn->get_component_name( ).
TRY.
lo_wdyn->get_all_data_for_comp(
EXPORTING
p_component_name = component_name
IMPORTING
p_enh_data = ls_enh_data ).
io_xml->add( iv_name = 'TOOL'
ig_data = ii_enh_tool->get_tool( ) ).
io_xml->add( iv_name = 'COMPONENT_DATA'
ig_data = ls_enh_data ).
CATCH cx_enh_not_found.
lcx_exception=>raise( |error serializing ENHO wdyn { ms_item-obj_name }| ).
ENDTRY.
ENDMETHOD. "lif_object_enho~serialize
ENDCLASS. "lcl_object_enho_wdyconf IMPLEMENTATION
*----------------------------------------------------------------------*
* CLASS lcl_object_enho_clif DEFINITION
@ -159,7 +286,6 @@ CLASS lcl_object_enho_clif DEFINITION.
RAISING lcx_exception.
ENDCLASS. "lcl_object_enho_clif DEFINITION
*----------------------------------------------------------------------*
* CLASS lcl_object_enho_clif IMPLEMENTATION
*----------------------------------------------------------------------*
@ -873,6 +999,136 @@ CLASS lcl_object_enho_class IMPLEMENTATION.
ENDCLASS. "lcl_object_enho_class IMPLEMENTATION
*----------------------------------------------------------------------*
* CLASS lcl_object_enho_wdyconf DEFINITION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS lcl_object_enho_fugr DEFINITION.
PUBLIC SECTION.
METHODS: constructor
IMPORTING
is_item TYPE lif_defs=>ty_item
io_files TYPE REF TO lcl_objects_files.
INTERFACES: lif_object_enho.
PRIVATE SECTION.
DATA: ms_item TYPE lif_defs=>ty_item,
mo_files TYPE REF TO lcl_objects_files.
ENDCLASS. "lcl_object_enho_wdyconf DEFINITION
*----------------------------------------------------------------------*
* CLASS lcl_object_enho_wdyconf IMPLEMENTATION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS lcl_object_enho_fugr IMPLEMENTATION.
METHOD constructor.
ms_item = is_item.
mo_files = io_files.
ENDMETHOD. "constructor
METHOD lif_object_enho~deserialize.
DATA: lo_fugrdata TYPE REF TO cl_enh_tool_fugr,
ls_enha_data TYPE enhfugrdata,
li_tool TYPE REF TO if_enh_tool,
tool TYPE enhtooltype,
lv_package TYPE devclass.
FIELD-SYMBOLS: <fuba> TYPE enhfugrfuncdata.
io_xml->read(
EXPORTING
iv_name = 'TOOL'
CHANGING
cg_data = tool ).
io_xml->read(
EXPORTING
iv_name = 'FUGRDATA'
CHANGING
cg_data = ls_enha_data ).
lv_package = iv_package.
TRY.
cl_enh_factory=>create_enhancement(
EXPORTING
enhname = |{ ms_item-obj_name }|
enhtype = ''
enhtooltype = tool
IMPORTING
enhancement = li_tool
CHANGING
devclass = lv_package ).
lo_fugrdata ?= li_tool.
lo_fugrdata->set_fugr( ls_enha_data-fugr ).
LOOP AT ls_enha_data-enh_fubas ASSIGNING <fuba>.
lo_fugrdata->set_func_data( func_name = <fuba>-fuba
func_enhadata = <fuba> ).
ENDLOOP.
lo_fugrdata->if_enh_object~save( ).
lo_fugrdata->if_enh_object~unlock( ).
CATCH cx_enh_root.
lcx_exception=>raise( |error deserializing ENHO fugrdata { ms_item-obj_name }| ).
ENDTRY.
ENDMETHOD. "lif_object_enho~deserialize
METHOD lif_object_enho~serialize.
DATA: lo_fugrdata TYPE REF TO cl_enh_tool_fugr,
fugr_name TYPE rs38l-area,
ls_enha_data TYPE enhfugrdata.
FIELD-SYMBOLS: <docuobj> TYPE enhfugrparamdocu.
lo_fugrdata ?= ii_enh_tool.
lo_fugrdata->get_fugr(
IMPORTING
fugr_name = fugr_name ).
TRY.
lo_fugrdata->get_all_data_for_fugr(
EXPORTING
fugr_name = fugr_name
IMPORTING
enha_data = ls_enha_data ).
LOOP AT ls_enha_data-docuobjs ASSIGNING <docuobj>.
CLEAR: <docuobj>-shorttext,
<docuobj>-longtext.
ENDLOOP.
CATCH cx_enh_not_found.
lcx_exception=>raise( |error deserializing ENHO fugrdata { ms_item-obj_name }| ).
ENDTRY.
io_xml->add( iv_name = 'TOOL'
ig_data = lo_fugrdata->if_enh_tool~get_tool( ) ).
io_xml->add( iv_name = 'FUGRDATA'
ig_data = ls_enha_data ).
ENDMETHOD. "lif_object_enho~serialize
ENDCLASS. "lcl_object_enho_wdyconf IMPLEMENTATION
*----------------------------------------------------------------------*
* CLASS lcl_object_enho DEFINITION
*----------------------------------------------------------------------*
@ -891,7 +1147,7 @@ CLASS lcl_object_enho DEFINITION INHERITING FROM lcl_objects_super FINAL.
IMPORTING
iv_tool TYPE enhtooltype
RETURNING
value(ri_enho) TYPE REF TO lif_object_enho
VALUE(ri_enho) TYPE REF TO lif_object_enho
RAISING
lcx_exception.
@ -988,9 +1244,16 @@ CLASS lcl_object_enho IMPLEMENTATION.
EXPORTING
is_item = ms_item
io_files = mo_files.
* ToDo:
* WHEN 'ENHFUGRDATA'. "cl_enh_tool_fugr
* WHEN 'ENHWDYN'. "cl_enh_tool_wdy
WHEN 'FUGRENH'.
CREATE OBJECT ri_enho TYPE lcl_object_enho_fugr
EXPORTING
is_item = ms_item
io_files = mo_files.
WHEN 'WDYENH'.
CREATE OBJECT ri_enho TYPE lcl_object_enho_wdyn
EXPORTING
is_item = ms_item
io_files = mo_files.
WHEN OTHERS.
lcx_exception=>raise( |Unsupported ENHO type { iv_tool }| ).
ENDCASE.

View File

@ -73,7 +73,7 @@ CLASS lcl_object_enhs IMPLEMENTATION.
EXPORTING
spot_name = lv_spot_name
tooltype = cl_enh_tool_badi_def=>tooltype
dark = abap_true
dark = abap_false
compositename = lv_parent
IMPORTING
spot = li_spot_ref

View File

@ -206,19 +206,34 @@ CLASS lcl_object_fugr IMPLEMENTATION.
METHOD deserialize_functions.
DATA: lv_include TYPE rs38l-include,
lv_area TYPE rs38l-area,
lt_source TYPE TABLE OF abaptxt255.
DATA: lv_include TYPE rs38l-include,
lv_area TYPE rs38l-area,
lv_group TYPE rs38l-area,
lv_namespace TYPE rs38l-namespace,
lt_source TYPE TABLE OF abaptxt255,
lv_dummy TYPE string.
FIELD-SYMBOLS: <ls_func> LIKE LINE OF it_functions.
LOOP AT it_functions ASSIGNING <ls_func>.
lt_source = mo_files->read_abap( iv_extra = <ls_func>-funcname ).
lv_area = ms_item-obj_name.
CALL FUNCTION 'FUNCTION_INCLUDE_SPLIT'
EXPORTING
complete_area = lv_area
IMPORTING
namespace = lv_namespace
group = lv_group
EXCEPTIONS
OTHERS = 12.
IF sy-subrc <> 0.
lcx_exception=>raise( 'error from FUNCTION_INCLUDE_SPLIT' ).
ENDIF.
CALL FUNCTION 'FUNCTION_EXISTS'
EXPORTING
funcname = <ls_func>-funcname
@ -244,13 +259,13 @@ CLASS lcl_object_fugr IMPLEMENTATION.
CALL FUNCTION 'RS_FUNCTIONMODULE_INSERT'
EXPORTING
funcname = <ls_func>-funcname
function_pool = lv_area
function_pool = lv_group
interface_global = <ls_func>-global_flag
remote_call = <ls_func>-remote_call
short_text = <ls_func>-short_text
update_task = <ls_func>-update_task
exception_class = <ls_func>-exception_classes
* NAMESPACE = ' ' todo
namespace = lv_namespace
remote_basxml_supported = <ls_func>-remote_basxml
IMPORTING
function_include = lv_include
@ -416,11 +431,12 @@ CLASS lcl_object_fugr IMPLEMENTATION.
cnam TYPE reposrc-cnam,
END OF ty_reposrc.
DATA: lt_reposrc TYPE STANDARD TABLE OF ty_reposrc WITH DEFAULT KEY,
ls_reposrc LIKE LINE OF lt_reposrc,
lv_program TYPE program,
lv_tabix LIKE sy-tabix,
lt_functab TYPE ty_rs38l_incl_tt.
DATA: lt_reposrc TYPE STANDARD TABLE OF ty_reposrc WITH DEFAULT KEY,
ls_reposrc LIKE LINE OF lt_reposrc,
lv_program TYPE program,
lv_offset_ns TYPE i,
lv_tabix LIKE sy-tabix,
lt_functab TYPE ty_rs38l_incl_tt.
FIELD-SYMBOLS: <lv_include> LIKE LINE OF rt_includes,
<ls_func> LIKE LINE OF lt_functab.
@ -450,7 +466,15 @@ CLASS lcl_object_fugr IMPLEMENTATION.
* handle generated maintenance views
APPEND INITIAL LINE TO rt_includes ASSIGNING <lv_include>.
<lv_include> = |L{ ms_item-obj_name }T00|.
IF ms_item-obj_name(1) <> '/'.
"FGroup name does not contain a namespace
<lv_include> = |L{ ms_item-obj_name }T00|.
ELSE.
"FGroup name contains a namespace
lv_offset_ns = find( val = ms_item-obj_name+1 sub = '/' ).
lv_offset_ns = lv_offset_ns + 2.
<lv_include> = |{ ms_item-obj_name(lv_offset_ns) }L{ ms_item-obj_name+lv_offset_ns }T00|.
ENDIF.
IF lines( rt_includes ) > 0.
SELECT progname cnam FROM reposrc

View File

@ -185,7 +185,13 @@ CLASS lcl_object_iarp IMPLEMENTATION.
ENDMETHOD. "lif_object~exists
METHOD lif_object~jump.
lcx_exception=>raise( 'todo, IARP, jump' ).
CALL FUNCTION 'RS_TOOL_ACCESS'
EXPORTING
operation = 'SHOW'
object_name = ms_item-obj_name
object_type = ms_item-obj_type.
ENDMETHOD. "lif_object~jump
METHOD lif_object~compare_to_remote_version.

View File

@ -185,7 +185,13 @@ CLASS lcl_object_iasp IMPLEMENTATION.
ENDMETHOD. "lif_object~exists
METHOD lif_object~jump.
lcx_exception=>raise( 'todo, IASP, jump' ).
CALL FUNCTION 'RS_TOOL_ACCESS'
EXPORTING
operation = 'SHOW'
object_name = ms_item-obj_name
object_type = ms_item-obj_type.
ENDMETHOD. "lif_object~jump
METHOD lif_object~compare_to_remote_version.

View File

@ -202,7 +202,13 @@ CLASS lcl_object_iatu IMPLEMENTATION.
ENDMETHOD. "lif_object~exists
METHOD lif_object~jump.
lcx_exception=>raise( 'todo, IATU, jump' ).
CALL FUNCTION 'RS_TOOL_ACCESS'
EXPORTING
operation = 'SHOW'
object_name = ms_item-obj_name
object_type = ms_item-obj_type.
ENDMETHOD. "lif_object~jump
METHOD lif_object~compare_to_remote_version.

View File

@ -0,0 +1,200 @@
*&---------------------------------------------------------------------*
*& Include zabapgit_object_jobd
*&---------------------------------------------------------------------*
CLASS lcl_object_jobd DEFINITION INHERITING FROM lcl_objects_super FINAL.
PUBLIC SECTION.
INTERFACES lif_object.
PRIVATE SECTION.
TYPES: ty_jd_name TYPE c LENGTH 32.
ENDCLASS.
CLASS lcl_object_jobd IMPLEMENTATION.
METHOD lif_object~has_changed_since.
rv_changed = abap_true.
ENDMETHOD.
METHOD lif_object~changed_by.
rv_user = c_user_unknown.
ENDMETHOD.
METHOD lif_object~get_metadata.
rs_metadata = get_metadata( ).
rs_metadata-delete_tadir = abap_true.
ENDMETHOD.
METHOD lif_object~exists.
DATA: jd_name TYPE ty_jd_name.
jd_name = ms_item-obj_name.
TRY.
CALL METHOD ('CL_JR_JD_MANAGER')=>('CHECK_JD_EXISTENCE')
EXPORTING
im_jd_name = jd_name
IMPORTING
ex_is_existing = rv_bool.
CATCH cx_root.
lcx_exception=>raise( |JOBD not supported| ).
ENDTRY.
ENDMETHOD.
METHOD lif_object~serialize.
DATA: lr_job_definition TYPE REF TO data,
lo_job_definition TYPE REF TO object,
jd_name TYPE ty_jd_name.
FIELD-SYMBOLS: <ls_job_definition> TYPE any,
<field> TYPE any.
jd_name = ms_item-obj_name.
TRY.
CREATE DATA lr_job_definition TYPE ('CL_JR_JOB_DEFINITION=>TY_JOB_DEFINITION').
ASSIGN lr_job_definition->* TO <ls_job_definition>.
ASSERT sy-subrc = 0.
CREATE OBJECT lo_job_definition TYPE ('CL_JR_JOB_DEFINITION')
EXPORTING
im_jd_name = jd_name.
CALL METHOD lo_job_definition->('GET_JD_ATTRIBUTES')
IMPORTING
ex_jd_attributes = <ls_job_definition>.
ASSIGN COMPONENT 'JDPACKAGE' OF STRUCTURE <ls_job_definition> TO <field>.
CLEAR <field>.
ASSIGN COMPONENT 'BTCJOB_USER' OF STRUCTURE <ls_job_definition> TO <field>.
CLEAR <field>.
ASSIGN COMPONENT 'OWNER' OF STRUCTURE <ls_job_definition> TO <field>.
CLEAR <field>.
ASSIGN COMPONENT 'CREATED_DATE' OF STRUCTURE <ls_job_definition> TO <field>.
CLEAR <field>.
ASSIGN COMPONENT 'CREATED_TIME' OF STRUCTURE <ls_job_definition> TO <field>.
CLEAR <field>.
ASSIGN COMPONENT 'CHANGED_DATE' OF STRUCTURE <ls_job_definition> TO <field>.
CLEAR <field>.
ASSIGN COMPONENT 'CHANGED_TIME' OF STRUCTURE <ls_job_definition> TO <field>.
CLEAR <field>.
io_xml->add( iv_name = 'JOBD'
ig_data = <ls_job_definition> ).
CATCH cx_root.
lcx_exception=>raise( |Error serializing JOBD| ).
ENDTRY.
ENDMETHOD.
METHOD lif_object~deserialize.
DATA: lr_job_definition TYPE REF TO data,
lo_job_definition TYPE REF TO object,
jd_name TYPE ty_jd_name.
FIELD-SYMBOLS: <ls_job_definition> TYPE any,
<field> TYPE any.
jd_name = ms_item-obj_name.
TRY.
CREATE DATA lr_job_definition TYPE ('CL_JR_JOB_DEFINITION=>TY_JOB_DEFINITION').
ASSIGN lr_job_definition->* TO <ls_job_definition>.
ASSERT sy-subrc = 0.
io_xml->read(
EXPORTING
iv_name = 'JOBD'
CHANGING
cg_data = <ls_job_definition> ).
CREATE OBJECT lo_job_definition TYPE ('CL_JR_JOB_DEFINITION')
EXPORTING
im_jd_name = jd_name.
ASSIGN COMPONENT 'JDPACKAGE' OF STRUCTURE <ls_job_definition> TO <field>.
<field> = iv_package.
CALL METHOD lo_job_definition->('CREATE_JD')
EXPORTING
im_jd_attributes = <ls_job_definition>.
CATCH cx_root.
lcx_exception=>raise( |Error deserializing JOBD| ).
ENDTRY.
lcl_objects_activation=>add_item( ms_item ).
ENDMETHOD.
METHOD lif_object~delete.
DATA: lo_job_definition TYPE REF TO object,
jd_name TYPE c LENGTH 32.
jd_name = ms_item-obj_name.
TRY.
CREATE OBJECT lo_job_definition TYPE ('CL_JR_JOB_DEFINITION')
EXPORTING
im_jd_name = jd_name.
CALL METHOD lo_job_definition->('DELETE_JD').
CATCH cx_root.
lcx_exception=>raise( |Error deleting JOBD| ).
ENDTRY.
ENDMETHOD.
METHOD lif_object~jump.
DATA: obj_name TYPE e071-obj_name.
obj_name = ms_item-obj_name.
CALL FUNCTION 'TR_OBJECT_JUMP_TO_TOOL'
EXPORTING
iv_pgmid = 'R3TR'
iv_object = ms_item-obj_type
iv_obj_name = obj_name
iv_action = 'SHOW'
EXCEPTIONS
jump_not_possible = 1
OTHERS = 2.
IF sy-subrc <> 0.
lcx_exception=>raise( |Error from TR_OBJECT_JUMP_TO_TOOL, JOBD| ).
ENDIF.
ENDMETHOD.
METHOD lif_object~compare_to_remote_version.
CREATE OBJECT ro_comparison_result TYPE lcl_comparison_null.
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_JOBD</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_OBJECT_JOBD</ENTRY>
<LENGTH>20</LENGTH>
</item>
</TPOOL>
</asx:values>
</asx:abap>
</abapGit>

View File

@ -250,7 +250,37 @@ CLASS lcl_object_nrob IMPLEMENTATION.
METHOD lif_object~jump.
lcx_exception=>raise( 'todo' ).
DATA: ls_bcdata TYPE bdcdata,
lt_bcdata TYPE STANDARD TABLE OF bdcdata.
ls_bcdata-program = 'SAPMSNRO'.
ls_bcdata-dynpro = '0150'.
ls_bcdata-dynbegin = 'X'.
APPEND ls_bcdata TO lt_bcdata.
CLEAR ls_bcdata.
ls_bcdata-fnam = 'NRIV-OBJECT'.
ls_bcdata-fval = ms_item-obj_name.
APPEND ls_bcdata TO lt_bcdata.
CLEAR ls_bcdata.
ls_bcdata-fnam = 'BDC_OKCODE'.
ls_bcdata-fval = '=DISP'.
APPEND ls_bcdata TO lt_bcdata.
CALL FUNCTION 'ABAP4_CALL_TRANSACTION'
STARTING NEW TASK 'GIT'
EXPORTING
tcode = 'SNRO'
mode_val = 'E'
TABLES
using_tab = lt_bcdata
EXCEPTIONS
OTHERS = 1.
IF sy-subrc <> 0.
lcx_exception=>raise( 'error from ABAP4_CALL_TRANSACTION, NROB' ).
ENDIF.
ENDMETHOD. "jump

View File

@ -603,8 +603,9 @@ CLASS lcl_oo_base IMPLEMENTATION.
METHOD lif_oo_object_fnc~read_descriptions.
SELECT * FROM seocompotx INTO TABLE rt_descriptions
WHERE clsname = iv_obejct_name. "#EC CI_SUBRC
DELETE rt_descriptions WHERE descript IS INITIAL.
WHERE clsname = iv_obejct_name
AND descript <> ''
ORDER BY PRIMARY KEY. "#EC CI_SUBRC
ENDMETHOD.
METHOD lif_oo_object_fnc~delete.

View File

@ -77,7 +77,7 @@ CLASS lcl_object_pinf IMPLEMENTATION.
IF rv_bool = abap_true.
SELECT SINGLE mainpack FROM tdevc INTO lv_main_pack
WHERE devclass = lv_pack_name.
WHERE devclass = lv_pack_name. "#EC CI_GENBUFF
rv_bool = boolc( sy-subrc = 0 ).
ENDIF.

View File

@ -0,0 +1,176 @@
*&---------------------------------------------------------------------*
*& Include zabapgit_object_prag
*&---------------------------------------------------------------------*
CLASS lcl_object_prag DEFINITION INHERITING FROM lcl_objects_super FINAL.
PUBLIC SECTION.
INTERFACES lif_object.
PRIVATE SECTION.
TYPES: BEGIN OF ty_pragma,
pragma TYPE c LENGTH 40,
extension TYPE c LENGTH 1,
signature TYPE c LENGTH 10,
description TYPE c LENGTH 255,
END OF ty_pragma.
METHODS:
_raise_pragma_not_exists
RAISING
lcx_exception,
_raise_pragma_exists
RAISING
lcx_exception,
_raise_pragma_enqueue
RAISING
lcx_exception.
ENDCLASS.
CLASS lcl_object_prag IMPLEMENTATION.
METHOD lif_object~has_changed_since.
rv_changed = abap_true.
ENDMETHOD.
METHOD lif_object~changed_by.
rv_user = c_user_unknown.
ENDMETHOD.
METHOD lif_object~get_metadata.
rs_metadata = get_metadata( ).
rs_metadata-delete_tadir = abap_true.
ENDMETHOD.
METHOD lif_object~exists.
TRY.
cl_abap_pragma=>get_ref( ms_item-obj_name ).
CATCH cx_abap_pragma_not_exists.
rv_bool = abap_false.
RETURN.
ENDTRY.
rv_bool = abap_true.
ENDMETHOD.
METHOD lif_object~serialize.
DATA: lo_pragma TYPE REF TO cl_abap_pragma,
pragma TYPE lcl_object_prag=>ty_pragma.
TRY.
lo_pragma = cl_abap_pragma=>get_ref( ms_item-obj_name ).
pragma-pragma = lo_pragma->pragma.
pragma-extension = lo_pragma->extension.
pragma-signature = lo_pragma->signature.
pragma-description = lo_pragma->description.
io_xml->add( iv_name = 'PRAG'
ig_data = pragma ).
CATCH cx_abap_pragma_not_exists.
_raise_pragma_not_exists( ).
ENDTRY.
ENDMETHOD.
METHOD lif_object~deserialize.
DATA: pragma TYPE ty_pragma,
lo_pragma TYPE REF TO cl_abap_pragma.
TRY.
io_xml->read(
EXPORTING
iv_name = 'PRAG'
CHANGING
cg_data = pragma ).
lo_pragma = cl_abap_pragma=>create( p_pragma = ms_item-obj_name
p_package = iv_package ).
lo_pragma->set_info( p_description = pragma-description
p_signature = pragma-signature
p_extension = pragma-extension ).
lo_pragma->save( ).
CATCH cx_abap_pragma_not_exists.
_raise_pragma_not_exists( ).
CATCH cx_abap_pragma_exists.
_raise_pragma_exists( ).
CATCH cx_abap_pragma_enqueue.
_raise_pragma_enqueue( ).
ENDTRY.
ENDMETHOD.
METHOD lif_object~delete.
DATA: lo_pragma TYPE REF TO cl_abap_pragma.
TRY.
lo_pragma = cl_abap_pragma=>get_ref( ms_item-obj_name ).
lo_pragma->delete( ).
CATCH cx_abap_pragma_not_exists.
_raise_pragma_not_exists( ).
CATCH cx_abap_pragma_enqueue.
_raise_pragma_enqueue( ).
ENDTRY.
ENDMETHOD.
METHOD lif_object~jump.
CALL FUNCTION 'RS_TOOL_ACCESS'
EXPORTING
operation = 'SHOW'
object_name = ms_item-obj_name
object_type = ms_item-obj_type
EXCEPTIONS
not_executed = 1
invalid_object_type = 2
OTHERS = 3.
ENDMETHOD.
METHOD lif_object~compare_to_remote_version.
CREATE OBJECT ro_comparison_result TYPE lcl_comparison_null.
ENDMETHOD.
METHOD _raise_pragma_enqueue.
lcx_exception=>raise( |Pragma { ms_item-obj_name } enqueue error| ).
ENDMETHOD.
METHOD _raise_pragma_exists.
lcx_exception=>raise( |Pragma { ms_item-obj_name } exists| ).
ENDMETHOD.
METHOD _raise_pragma_not_exists.
lcx_exception=>raise( |Pragma { ms_item-obj_name } doesn't exist| ).
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_PRAG</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_OBJECT_PRAG</ENTRY>
<LENGTH>20</LENGTH>
</item>
</TPOOL>
</asx:values>
</asx:abap>
</abapGit>

View File

@ -2,41 +2,13 @@
*& Include ZABAPGIT_OBJECT_SAMC
*&---------------------------------------------------------------------*
CLASS lcl_object_samc DEFINITION INHERITING FROM lcl_objects_super FINAL.
PUBLIC SECTION.
INTERFACES lif_object.
PRIVATE SECTION.
DATA: mo_persistence TYPE REF TO if_wb_object_persist,
mo_amc_appl_obj_data TYPE REF TO if_wb_object_data_model.
CLASS lcl_object_samc DEFINITION INHERITING FROM lcl_objects_saxx_super FINAL.
PROTECTED SECTION.
METHODS:
get_data_object
RETURNING
VALUE(ro_amc_appl_obj_data) TYPE REF TO if_wb_object_data_model
RAISING
lcx_exception,
get_persistence
RETURNING
VALUE(ro_persistence) TYPE REF TO if_wb_object_persist
RAISING
lcx_exception,
get_data
EXPORTING
p_data TYPE any
RAISING
lcx_exception,
lock
RAISING
lcx_exception,
unlock
RAISING
lcx_exception.
get_persistence_class_name REDEFINITION,
get_data_class_name REDEFINITION,
get_data_structure_name REDEFINITION.
ENDCLASS. "lcl_object_samc DEFINITION
@ -47,319 +19,22 @@ ENDCLASS. "lcl_object_samc DEFINITION
*----------------------------------------------------------------------*
CLASS lcl_object_samc IMPLEMENTATION.
METHOD lif_object~has_changed_since.
rv_changed = abap_true.
ENDMETHOD. "lif_object~has_changed_since
METHOD get_data_class_name.
METHOD lif_object~changed_by.
DATA: lr_data TYPE REF TO data.
FIELD-SYMBOLS: <ls_data> TYPE any,
<ls_header> TYPE any,
<changed_by> TYPE any.
TRY.
CREATE DATA lr_data TYPE ('AMC_APPLICATION_COMPLETE').
ASSIGN lr_data->* TO <ls_data>.
CATCH cx_root.
lcx_exception=>raise( 'SAMC not supported' ).
ENDTRY.
get_data(
IMPORTING
p_data = <ls_data> ).
ASSIGN COMPONENT 'HEADER' OF STRUCTURE <ls_data> TO <ls_header>.
ASSERT sy-subrc = 0.
ASSIGN COMPONENT 'CHANGED_BY' OF STRUCTURE <ls_header> TO <changed_by>.
ASSERT sy-subrc = 0.
rv_user = <changed_by>.
r_data_class_name = 'CL_AMC_APPLICATION_OBJ_DATA'.
ENDMETHOD.
METHOD lif_object~get_metadata.
rs_metadata = get_metadata( ).
rs_metadata-delete_tadir = abap_true.
ENDMETHOD. "lif_object~get_metadata.
METHOD get_data_structure_name.
METHOD lif_object~exists.
DATA: ls_tadir TYPE tadir.
ls_tadir = lcl_tadir=>read_single(
iv_object = ms_item-obj_type
iv_obj_name = ms_item-obj_name ).
IF ls_tadir IS INITIAL.
RETURN.
ENDIF.
TRY.
get_data_object( ).
CATCH lcx_exception.
RETURN.
ENDTRY.
rv_bool = abap_true.
ENDMETHOD. "lif_object~exists
METHOD lif_object~serialize.
DATA: lr_data TYPE REF TO data.
FIELD-SYMBOLS: <ls_data> TYPE any,
<ls_header> TYPE any,
<field> TYPE any.
TRY.
CREATE DATA lr_data TYPE ('AMC_APPLICATION_COMPLETE').
ASSIGN lr_data->* TO <ls_data>.
CATCH cx_root.
lcx_exception=>raise( 'SAMC not supported' ).
ENDTRY.
get_data(
IMPORTING
p_data = <ls_data> ).
ASSIGN COMPONENT 'HEADER' OF STRUCTURE <ls_data> TO <ls_header>.
ASSERT sy-subrc = 0.
ASSIGN COMPONENT 'CHANGED_ON' OF STRUCTURE <ls_header> TO <field>.
ASSERT sy-subrc = 0.
CLEAR <field>.
ASSIGN COMPONENT 'CHANGED_BY' OF STRUCTURE <ls_header> TO <field>.
ASSERT sy-subrc = 0.
CLEAR <field>.
ASSIGN COMPONENT 'CHANGED_AT' OF STRUCTURE <ls_header> TO <field>.
ASSERT sy-subrc = 0.
CLEAR <field>.
ASSIGN COMPONENT 'CHANGED_CLNT' OF STRUCTURE <ls_header> TO <field>.
ASSERT sy-subrc = 0.
CLEAR <field>.
ASSIGN COMPONENT 'CREATED_ON' OF STRUCTURE <ls_header> TO <field>.
ASSERT sy-subrc = 0.
CLEAR <field>.
ASSIGN COMPONENT 'CREATED_BY' OF STRUCTURE <ls_header> TO <field>.
ASSERT sy-subrc = 0.
CLEAR <field>.
ASSIGN COMPONENT 'CREATED_AT' OF STRUCTURE <ls_header> TO <field>.
ASSERT sy-subrc = 0.
CLEAR <field>.
ASSIGN COMPONENT 'CREATED_CLNT' OF STRUCTURE <ls_header> TO <field>.
ASSERT sy-subrc = 0.
CLEAR <field>.
io_xml->add( iv_name = 'SAMC'
ig_data = <ls_data> ).
ENDMETHOD. "serialize
METHOD lif_object~deserialize.
DATA: li_appl_obj_data TYPE REF TO if_wb_object_data_model,
lr_data TYPE REF TO data.
FIELD-SYMBOLS: <ls_data> TYPE any.
TRY.
CREATE DATA lr_data TYPE ('AMC_APPLICATION_COMPLETE').
ASSIGN lr_data->* TO <ls_data>.
CATCH cx_root.
lcx_exception=>raise( 'SAMC not supported' ).
ENDTRY.
io_xml->read(
EXPORTING
iv_name = 'SAMC'
CHANGING
cg_data = <ls_data> ).
IF lif_object~exists( ) = abap_true.
lif_object~delete( ).
ENDIF.
li_appl_obj_data = get_data_object( ).
TRY.
lock( ).
CALL FUNCTION 'RS_CORR_INSERT'
EXPORTING
object = ms_item-obj_name
object_class = 'SAMC'
mode = 'I'
global_lock = abap_true
devclass = iv_package
master_language = mv_language
EXCEPTIONS
cancelled = 1
permission_failure = 2
unknown_objectclass = 3
OTHERS = 4.
IF sy-subrc <> 0.
lcx_exception=>raise( 'Error occured while creating SAMC' ).
ENDIF.
li_appl_obj_data->set_data( <ls_data> ).
get_persistence( )->save( p_object_data = li_appl_obj_data ).
unlock( ).
CATCH cx_swb_exception.
lcx_exception=>raise( 'Error occured while creating SAMC' ).
ENDTRY.
ENDMETHOD. "deserialize
METHOD lif_object~delete.
DATA: object_key TYPE seu_objkey.
object_key = ms_item-obj_name.
TRY.
lock( ).
get_persistence( )->delete( p_object_key = object_key ).
unlock( ).
CATCH cx_swb_exception.
lcx_exception=>raise( 'Error occured while deleting SAMC' ).
ENDTRY.
ENDMETHOD. "delete
METHOD lif_object~jump.
CALL FUNCTION 'RS_TOOL_ACCESS'
EXPORTING
operation = 'SHOW'
object_name = ms_item-obj_name
object_type = ms_item-obj_type.
ENDMETHOD. "jump
METHOD lif_object~compare_to_remote_version.
CREATE OBJECT ro_comparison_result TYPE lcl_comparison_null.
ENDMETHOD.
METHOD get_data_object.
IF mo_amc_appl_obj_data IS NOT BOUND.
TRY.
CREATE OBJECT mo_amc_appl_obj_data TYPE ('CL_AMC_APPLICATION_OBJ_DATA').
CATCH cx_root.
lcx_exception=>raise( 'SAMC not supported' ).
ENDTRY.
ENDIF.
ro_amc_appl_obj_data = mo_amc_appl_obj_data.
r_data_structure_name = 'AMC_APPLICATION_COMPLETE'.
ENDMETHOD.
METHOD get_persistence_class_name.
METHOD get_persistence.
IF mo_persistence IS NOT BOUND.
TRY.
CREATE OBJECT mo_persistence TYPE ('CL_AMC_APPLICATION_OBJ_PERS').
CATCH cx_root.
lcx_exception=>raise( 'SAMC not supported' ).
ENDTRY.
ENDIF.
ro_persistence = mo_persistence.
r_persistence_class_name = 'CL_AMC_APPLICATION_OBJ_PERS'.
ENDMETHOD.
METHOD lock.
DATA: objname TYPE trobj_name,
object_key TYPE seu_objkey,
objtype TYPE trobjtype.
objname = ms_item-obj_name.
object_key = ms_item-obj_name.
objtype = ms_item-obj_type.
get_persistence( )->lock(
EXPORTING
p_objname_tr = objname
p_object_key = object_key
p_objtype_tr = objtype
EXCEPTIONS
foreign_lock = 1
error_occurred = 2
OTHERS = 3 ).
IF sy-subrc <> 0.
lcx_exception=>raise( `Error occured while locking SAMC ` && objname ).
ENDIF.
ENDMETHOD.
METHOD unlock.
DATA: objname TYPE trobj_name,
object_key TYPE seu_objkey,
objtype TYPE trobjtype.
objname = ms_item-obj_name.
object_key = ms_item-obj_name.
objtype = ms_item-obj_type.
get_persistence( )->unlock( p_objname_tr = objname
p_object_key = object_key
p_objtype_tr = objtype ).
ENDMETHOD.
METHOD get_data.
DATA: object_key TYPE seu_objkey.
object_key = ms_item-obj_name.
TRY.
get_persistence( )->get(
EXPORTING
p_object_key = object_key
p_version = 'A'
CHANGING
p_object_data = mo_amc_appl_obj_data ).
CATCH cx_root.
lcx_exception=>raise( 'SAMC error' ).
ENDTRY.
mo_amc_appl_obj_data->get_data(
IMPORTING
p_data = p_data ).
ENDMETHOD.
ENDCLASS. "lcl_object_samc IMPLEMENTATION

View File

@ -2,41 +2,13 @@
*& Include ZABAPGIT_OBJECT_SAPC
*&---------------------------------------------------------------------*
CLASS lcl_object_sapc DEFINITION INHERITING FROM lcl_objects_super FINAL.
PUBLIC SECTION.
INTERFACES lif_object.
PRIVATE SECTION.
DATA: mo_persistence TYPE REF TO if_wb_object_persist,
mo_apc_appl_obj_data TYPE REF TO if_wb_object_data_model.
CLASS lcl_object_sapc DEFINITION INHERITING FROM lcl_objects_saxx_super FINAL.
PROTECTED SECTION.
METHODS:
get_data_object
RETURNING
VALUE(ro_apc_appl_obj_data) TYPE REF TO if_wb_object_data_model
RAISING
lcx_exception,
get_persistence
RETURNING
VALUE(ro_persistence) TYPE REF TO if_wb_object_persist
RAISING
lcx_exception,
get_data
EXPORTING
p_data TYPE any
RAISING
lcx_exception,
lock
RAISING
lcx_exception,
unlock
RAISING
lcx_exception.
get_persistence_class_name REDEFINITION,
get_data_class_name REDEFINITION,
get_data_structure_name REDEFINITION.
ENDCLASS. "lcl_object_sAPC DEFINITION
@ -47,319 +19,22 @@ ENDCLASS. "lcl_object_sAPC DEFINITION
*----------------------------------------------------------------------*
CLASS lcl_object_sapc IMPLEMENTATION.
METHOD lif_object~has_changed_since.
rv_changed = abap_true.
ENDMETHOD. "lif_object~has_changed_since
METHOD get_data_class_name.
METHOD lif_object~changed_by.
DATA: lr_data TYPE REF TO data.
FIELD-SYMBOLS: <ls_data> TYPE any,
<ls_header> TYPE any,
<changed_by> TYPE any.
TRY.
CREATE DATA lr_data TYPE ('APC_APPLICATION_COMPLETE').
ASSIGN lr_data->* TO <ls_data>.
CATCH cx_root.
lcx_exception=>raise( 'SAPC not supported' ).
ENDTRY.
get_data(
IMPORTING
p_data = <ls_data> ).
ASSIGN COMPONENT 'HEADER' OF STRUCTURE <ls_data> TO <ls_header>.
ASSERT sy-subrc = 0.
ASSIGN COMPONENT 'CHANGED_BY' OF STRUCTURE <ls_header> TO <changed_by>.
ASSERT sy-subrc = 0.
rv_user = <changed_by>.
r_data_class_name = 'CL_APC_APPLICATION_OBJ_DATA'.
ENDMETHOD.
METHOD lif_object~get_metadata.
rs_metadata = get_metadata( ).
rs_metadata-delete_tadir = abap_true.
ENDMETHOD. "lif_object~get_metadata.
METHOD get_data_structure_name.
METHOD lif_object~exists.
DATA: ls_tadir TYPE tadir.
ls_tadir = lcl_tadir=>read_single(
iv_object = ms_item-obj_type
iv_obj_name = ms_item-obj_name ).
IF ls_tadir IS INITIAL.
RETURN.
ENDIF.
TRY.
get_data_object( ).
CATCH lcx_exception.
RETURN.
ENDTRY.
rv_bool = abap_true.
ENDMETHOD. "lif_object~exists
METHOD lif_object~serialize.
DATA: lr_data TYPE REF TO data.
FIELD-SYMBOLS: <ls_data> TYPE any,
<ls_header> TYPE any,
<field> TYPE any.
TRY.
CREATE DATA lr_data TYPE ('APC_APPLICATION_COMPLETE').
ASSIGN lr_data->* TO <ls_data>.
CATCH cx_root.
lcx_exception=>raise( 'SAPC not supported' ).
ENDTRY.
get_data(
IMPORTING
p_data = <ls_data> ).
ASSIGN COMPONENT 'HEADER' OF STRUCTURE <ls_data> TO <ls_header>.
ASSERT sy-subrc = 0.
ASSIGN COMPONENT 'CHANGED_ON' OF STRUCTURE <ls_header> TO <field>.
ASSERT sy-subrc = 0.
CLEAR <field>.
ASSIGN COMPONENT 'CHANGED_BY' OF STRUCTURE <ls_header> TO <field>.
ASSERT sy-subrc = 0.
CLEAR <field>.
ASSIGN COMPONENT 'CHANGED_AT' OF STRUCTURE <ls_header> TO <field>.
ASSERT sy-subrc = 0.
CLEAR <field>.
ASSIGN COMPONENT 'CHANGED_CLNT' OF STRUCTURE <ls_header> TO <field>.
ASSERT sy-subrc = 0.
CLEAR <field>.
ASSIGN COMPONENT 'CREATED_ON' OF STRUCTURE <ls_header> TO <field>.
ASSERT sy-subrc = 0.
CLEAR <field>.
ASSIGN COMPONENT 'CREATED_BY' OF STRUCTURE <ls_header> TO <field>.
ASSERT sy-subrc = 0.
CLEAR <field>.
ASSIGN COMPONENT 'CREATED_AT' OF STRUCTURE <ls_header> TO <field>.
ASSERT sy-subrc = 0.
CLEAR <field>.
ASSIGN COMPONENT 'CREATED_CLNT' OF STRUCTURE <ls_header> TO <field>.
ASSERT sy-subrc = 0.
CLEAR <field>.
io_xml->add( iv_name = 'SAPC'
ig_data = <ls_data> ).
ENDMETHOD. "serialize
METHOD lif_object~deserialize.
DATA: appl_obj_data TYPE REF TO if_wb_object_data_model,
lr_data TYPE REF TO data.
FIELD-SYMBOLS: <ls_data> TYPE any.
TRY.
CREATE DATA lr_data TYPE ('APC_APPLICATION_COMPLETE').
ASSIGN lr_data->* TO <ls_data>.
CATCH cx_root.
lcx_exception=>raise( 'SAPC not supported' ).
ENDTRY.
io_xml->read(
EXPORTING
iv_name = 'SAPC'
CHANGING
cg_data = <ls_data> ).
IF lif_object~exists( ) = abap_true.
lif_object~delete( ).
ENDIF.
appl_obj_data = get_data_object( ).
TRY.
lock( ).
CALL FUNCTION 'RS_CORR_INSERT'
EXPORTING
object = ms_item-obj_name
object_class = 'SAPC'
mode = 'I'
global_lock = abap_true
devclass = iv_package
master_language = mv_language
EXCEPTIONS
cancelled = 1
permission_failure = 2
unknown_objectclass = 3
OTHERS = 4.
IF sy-subrc <> 0.
lcx_exception=>raise( 'Error occured while creating SAPC' ).
ENDIF.
appl_obj_data->set_data( <ls_data> ).
get_persistence( )->save( p_object_data = appl_obj_data ).
unlock( ).
CATCH cx_swb_exception.
lcx_exception=>raise( 'Error occured while creating SAPC' ).
ENDTRY.
ENDMETHOD. "deserialize
METHOD lif_object~delete.
DATA: object_key TYPE seu_objkey.
object_key = ms_item-obj_name.
TRY.
lock( ).
get_persistence( )->delete( p_object_key = object_key ).
unlock( ).
CATCH cx_swb_exception.
lcx_exception=>raise( 'Error occured while deleting SAPC' ).
ENDTRY.
ENDMETHOD. "delete
METHOD lif_object~jump.
CALL FUNCTION 'RS_TOOL_ACCESS'
EXPORTING
operation = 'SHOW'
object_name = ms_item-obj_name
object_type = ms_item-obj_type.
ENDMETHOD. "jump
METHOD lif_object~compare_to_remote_version.
CREATE OBJECT ro_comparison_result TYPE lcl_comparison_null.
ENDMETHOD.
METHOD get_data_object.
IF mo_apc_appl_obj_data IS NOT BOUND.
TRY.
CREATE OBJECT mo_apc_appl_obj_data TYPE ('CL_APC_APPLICATION_OBJ_DATA').
CATCH cx_root.
lcx_exception=>raise( 'SAPC not supported' ).
ENDTRY.
ENDIF.
ro_apc_appl_obj_data = mo_apc_appl_obj_data.
r_data_structure_name = 'APC_APPLICATION_COMPLETE'.
ENDMETHOD.
METHOD get_persistence_class_name.
METHOD get_persistence.
IF mo_persistence IS NOT BOUND.
TRY.
CREATE OBJECT mo_persistence TYPE ('CL_APC_APPLICATION_OBJ_PERS').
CATCH cx_root.
lcx_exception=>raise( 'SAPC not supported' ).
ENDTRY.
ENDIF.
ro_persistence = mo_persistence.
r_persistence_class_name = 'CL_APC_APPLICATION_OBJ_PERS'.
ENDMETHOD.
METHOD lock.
DATA: objname TYPE trobj_name,
object_key TYPE seu_objkey,
objtype TYPE trobjtype.
objname = ms_item-obj_name.
object_key = ms_item-obj_name.
objtype = ms_item-obj_type.
get_persistence( )->lock(
EXPORTING
p_objname_tr = objname
p_object_key = object_key
p_objtype_tr = objtype
EXCEPTIONS
foreign_lock = 1
error_occurred = 2
OTHERS = 3 ).
IF sy-subrc <> 0.
lcx_exception=>raise( `Error occured while locking SAPC ` && objname ).
ENDIF.
ENDMETHOD.
METHOD unlock.
DATA: objname TYPE trobj_name,
object_key TYPE seu_objkey,
objtype TYPE trobjtype.
objname = ms_item-obj_name.
object_key = ms_item-obj_name.
objtype = ms_item-obj_type.
get_persistence( )->unlock( p_objname_tr = objname
p_object_key = object_key
p_objtype_tr = objtype ).
ENDMETHOD.
METHOD get_data.
DATA: object_key TYPE seu_objkey.
object_key = ms_item-obj_name.
TRY.
get_persistence( )->get(
EXPORTING
p_object_key = object_key
p_version = 'A'
CHANGING
p_object_data = mo_apc_appl_obj_data ).
CATCH cx_root.
lcx_exception=>raise( 'SAPC error' ).
ENDTRY.
mo_apc_appl_obj_data->get_data(
IMPORTING
p_data = p_data ).
ENDMETHOD.
ENDCLASS. "lcl_object_sAPC IMPLEMENTATION

View File

@ -8,8 +8,11 @@ INCLUDE zabapgit_object_acid.
INCLUDE zabapgit_object_auth.
INCLUDE zabapgit_object_oo_functions.
INCLUDE zabapgit_object_clas.
INCLUDE zabapgit_object_clas_new.
INCLUDE zabapgit_object_cmpt.
INCLUDE zabapgit_object_dcls.
INCLUDE zabapgit_object_ddls.
INCLUDE zabapgit_object_dial.
INCLUDE zabapgit_object_doct.
INCLUDE zabapgit_object_docv.
INCLUDE zabapgit_object_doma.
@ -23,11 +26,13 @@ INCLUDE zabapgit_object_fugr.
INCLUDE zabapgit_object_iarp.
INCLUDE zabapgit_object_iasp.
INCLUDE zabapgit_object_iatu.
INCLUDE zabapgit_object_jobd.
INCLUDE zabapgit_object_intf.
INCLUDE zabapgit_object_msag.
INCLUDE zabapgit_object_nrob.
INCLUDE zabapgit_object_para.
INCLUDE zabapgit_object_pinf.
INCLUDE zabapgit_object_prag.
INCLUDE zabapgit_object_prog.
INCLUDE zabapgit_object_samc.
INCLUDE zabapgit_object_sapc.
@ -38,6 +43,7 @@ INCLUDE zabapgit_object_sfpi.
INCLUDE zabapgit_object_sfsw.
INCLUDE zabapgit_object_shi3.
INCLUDE zabapgit_object_shlp.
INCLUDE zabapgit_object_shma.
INCLUDE zabapgit_object_sicf.
INCLUDE zabapgit_object_smim.
INCLUDE zabapgit_object_splo.

View File

@ -74,7 +74,13 @@ CLASS lcl_object_sfpf IMPLEMENTATION.
ENDMETHOD. "lif_object~exists
METHOD lif_object~jump.
lcx_exception=>raise( 'todo, SFPF jump' ).
CALL FUNCTION 'RS_TOOL_ACCESS'
EXPORTING
operation = 'SHOW'
object_name = ms_item-obj_name
object_type = ms_item-obj_type.
ENDMETHOD. "jump
METHOD lif_object~delete.

View File

@ -70,7 +70,13 @@ CLASS lcl_object_sfpi IMPLEMENTATION.
ENDMETHOD. "lif_object~exists
METHOD lif_object~jump.
lcx_exception=>raise( 'todo, SFPI jump' ).
CALL FUNCTION 'RS_TOOL_ACCESS'
EXPORTING
operation = 'SHOW'
object_name = ms_item-obj_name
object_type = ms_item-obj_type.
ENDMETHOD. "jump
METHOD lif_object~delete.

View File

@ -30,7 +30,7 @@ CLASS lcl_object_shlp IMPLEMENTATION.
SELECT SINGLE as4date as4time FROM dd30l
INTO (lv_date, lv_time)
WHERE shlpname = ms_item-obj_name
AND as4local = 'A'.
AND as4local = 'A'. "#EC CI_GENBUFF
rv_changed = check_timestamp(
iv_timestamp = iv_timestamp

View File

@ -0,0 +1,273 @@
*&---------------------------------------------------------------------*
*& Include zabapgit_object_shma
*&---------------------------------------------------------------------*
CLASS lcl_object_shma DEFINITION INHERITING FROM lcl_objects_super FINAL.
PUBLIC SECTION.
INTERFACES lif_object.
ENDCLASS.
CLASS lcl_object_shma IMPLEMENTATION.
METHOD lif_object~has_changed_since.
rv_changed = abap_true.
ENDMETHOD.
METHOD lif_object~changed_by.
rv_user = c_user_unknown.
ENDMETHOD.
METHOD lif_object~get_metadata.
rs_metadata = get_metadata( ).
ENDMETHOD.
METHOD lif_object~exists.
DATA: lv_area_name TYPE shm_area_name.
SELECT SINGLE area_name
FROM shma_attributes
INTO lv_area_name
WHERE area_name = ms_item-obj_name.
rv_bool = boolc( sy-subrc = 0 ).
ENDMETHOD.
METHOD lif_object~serialize.
DATA: lv_area_name TYPE shm_area_name,
ls_area_attributes TYPE shma_attributes.
lv_area_name = ms_item-obj_name.
TRY.
CALL METHOD ('\PROGRAM=SAPLSHMA\CLASS=LCL_SHMA_HELPER')=>('READ_AREA_ATTRIBUTES_ALL')
EXPORTING
area_name = lv_area_name
IMPORTING
area_attributes = ls_area_attributes.
CLEAR: ls_area_attributes-chg_user,
ls_area_attributes-chg_date,
ls_area_attributes-chg_time,
ls_area_attributes-cls_gen_user ,
ls_area_attributes-cls_gen_date ,
ls_area_attributes-cls_gen_time.
io_xml->add( iv_name = 'AREA_ATTRIBUTES'
ig_data = ls_area_attributes ).
CATCH cx_root.
lcx_exception=>raise( |Error serializing SHMA { ms_item-obj_name }| ).
ENDTRY.
ENDMETHOD.
METHOD lif_object~deserialize.
DATA: lv_area_name TYPE shm_area_name,
ls_area_attributes TYPE shma_attributes.
lv_area_name = ms_item-obj_name.
io_xml->read(
EXPORTING
iv_name = 'AREA_ATTRIBUTES'
CHANGING
cg_data = ls_area_attributes ).
TRY.
CALL METHOD ('\PROGRAM=SAPLSHMA\CLASS=LCL_SHMA_HELPER')=>('INSERT_AREA')
EXPORTING
area_name = lv_area_name
attributes = ls_area_attributes
force_overwrite = abap_true
no_class_generation = abap_true
silent_mode = abap_true.
CATCH cx_root.
lcx_exception=>raise( |Error serializing SHMA { ms_item-obj_name }| ).
ENDTRY.
ENDMETHOD.
METHOD lif_object~delete.
" We can't use FM SHMA_DELETE_AREA because it depends
" on the corresponding class, but in abapGit it has its own
" lifecycle. Therefore we have to reimplement most of the
" FMs logic
CONSTANTS: lc_request_delete TYPE i VALUE '4'.
DATA: lv_request TYPE i,
lv_area_name TYPE shm_area_name,
lv_order TYPE e070-trkorr,
lv_korrnum TYPE tadir-korrnum,
lv_objname TYPE tadir-obj_name,
lv_task TYPE e070-trkorr,
lv_append TYPE abap_bool,
ls_tadir TYPE tadir,
ls_tdevc TYPE tdevc,
lo_cts_if TYPE REF TO object.
lv_area_name = ms_item-obj_name.
TRY.
CALL FUNCTION 'ENQUEUE_E_SHM_AREA'
EXPORTING
mode_shma_attributes = 'E'
area_name = lv_area_name
x_area_name = ' '
_scope = '2'
_wait = ' '
_collect = ' '
EXCEPTIONS
foreign_lock = 1
system_failure = 2
OTHERS = 3.
IF sy-subrc <> 0.
lcx_exception=>raise( |Error deleting SHMA { ms_item-obj_name }| ).
ENDIF.
CALL METHOD ('\PROGRAM=SAPMSHM_MONITOR\CLASS=LCL_SHMM')=>('FREE_AREA_BY_NAME')
EXPORTING
area_name = lv_area_name
affect_server = cl_shm_area=>affect_all_servers.
CREATE OBJECT lo_cts_if TYPE ('\FUNCTION-POOL=SHMA\CLASS=LCL_CTS_INTERFACE')
EXPORTING
area = lv_area_name.
CALL METHOD lo_cts_if->('CHECK_AREA')
EXPORTING
request = lc_request_delete
IMPORTING
access_mode = lv_request
appendable = lv_append.
IF lv_request <> lc_request_delete.
lcx_exception=>raise( |Error deleting SHMA { ms_item-obj_name }| ).
ENDIF.
CALL METHOD lo_cts_if->('INSERT_AREA')
EXPORTING
request = lc_request_delete
IMPORTING
order = lv_order
task = lv_task.
DELETE FROM shma_attributes WHERE area_name = lv_area_name.
DELETE FROM shma_start WHERE area_name = lv_area_name.
lv_korrnum = lv_order.
lv_objname = lv_area_name.
CALL FUNCTION 'TR_TADIR_INTERFACE'
EXPORTING
wi_read_only = abap_true
wi_tadir_pgmid = 'R3TR'
wi_tadir_object = 'SHMA'
wi_tadir_obj_name = lv_objname
IMPORTING
new_tadir_entry = ls_tadir
EXCEPTIONS
OTHERS = 0.
CALL FUNCTION 'TR_DEVCLASS_GET'
EXPORTING
iv_devclass = ls_tadir-devclass
IMPORTING
es_tdevc = ls_tdevc
EXCEPTIONS
OTHERS = 1.
IF sy-subrc = 0 AND ls_tdevc-korrflag IS INITIAL.
" TADIR entries for local objects must be deleted 'by hand'
CALL FUNCTION 'TR_TADIR_INTERFACE'
EXPORTING
wi_test_modus = abap_false
wi_delete_tadir_entry = abap_true
wi_tadir_pgmid = 'R3TR'
wi_tadir_object = 'SHMA'
wi_tadir_obj_name = lv_objname
wi_tadir_korrnum = lv_korrnum
EXCEPTIONS
OTHERS = 0.
ENDIF.
CALL METHOD ('\PROGRAM=SAPLSHMA\CLASS=LCL_SHMA_HELPER')=>('DELETE_RUNTIME_SETTINGS')
EXPORTING
area_name = lv_area_name.
CALL FUNCTION 'DEQUEUE_E_SHM_AREA'
EXPORTING
mode_shma_attributes = 'E'
area_name = lv_area_name
x_area_name = ' '
_scope = '3'
_synchron = ' '
_collect = ' '.
CATCH cx_root.
lcx_exception=>raise( |Error deleting SHMA { ms_item-obj_name }| ).
ENDTRY.
ENDMETHOD.
METHOD lif_object~jump.
DATA: ls_bcdata TYPE bdcdata,
lt_bcdata TYPE STANDARD TABLE OF bdcdata.
ls_bcdata-program = 'SAPLSHMA'.
ls_bcdata-dynpro = '0100'.
ls_bcdata-dynbegin = 'X'.
APPEND ls_bcdata TO lt_bcdata.
CLEAR ls_bcdata.
ls_bcdata-fnam = 'SHMA_ATTRIBUTES-AREA_NAME'.
ls_bcdata-fval = ms_item-obj_name.
APPEND ls_bcdata TO lt_bcdata.
CLEAR ls_bcdata.
ls_bcdata-fnam = 'BDC_OKCODE'.
ls_bcdata-fval = '=SHOW'.
APPEND ls_bcdata TO lt_bcdata.
CALL FUNCTION 'ABAP4_CALL_TRANSACTION'
STARTING NEW TASK 'GIT'
EXPORTING
tcode = 'SHMA'
mode_val = 'E'
TABLES
using_tab = lt_bcdata
EXCEPTIONS
OTHERS = 1.
IF sy-subrc <> 0.
lcx_exception=>raise( 'error from ABAP4_CALL_TRANSACTION, SHMA' ).
ENDIF.
ENDMETHOD.
METHOD lif_object~compare_to_remote_version.
CREATE OBJECT ro_comparison_result TYPE lcl_comparison_null.
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_SHMA</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_OBJECT_SHMA</ENTRY>
<LENGTH>20</LENGTH>
</item>
</TPOOL>
</asx:values>
</asx:abap>
</abapGit>

View File

@ -77,6 +77,10 @@ CLASS lcl_object_sicf IMPLEMENTATION.
rv_user = ls_icfservice-icf_muser.
IF rv_user IS INITIAL.
rv_user = c_user_unknown.
ENDIF.
ENDMETHOD.
METHOD lif_object~get_metadata.
@ -85,11 +89,20 @@ CLASS lcl_object_sicf IMPLEMENTATION.
METHOD lif_object~exists.
DATA: ls_icfservice TYPE icfservice.
DATA: ls_tadir TYPE tadir,
ls_key TYPE ty_sicf_key.
ls_tadir = lcl_tadir=>read_single_sicf( ms_item-obj_name ).
read( IMPORTING es_icfservice = ls_icfservice ).
rv_bool = boolc( NOT ls_icfservice IS INITIAL ).
rv_bool = boolc( NOT ls_tadir IS INITIAL ).
IF rv_bool = abap_true.
ls_key = ls_tadir-obj_name.
SELECT SINGLE icfaltnme FROM icfservice INTO ls_key-icf_name
WHERE icf_name = ls_key-icf_name
AND icfparguid = ls_key-icfparguid.
rv_bool = boolc( sy-subrc = 0 ).
ENDIF.
ENDMETHOD. "lif_object~exists
@ -140,17 +153,7 @@ CLASS lcl_object_sicf IMPLEMENTATION.
CLEAR et_icfhandler.
CLEAR ev_url.
ls_key = ms_item-obj_name.
IF ls_key-icfparguid IS INITIAL.
* limitation: name must be unique
SELECT SINGLE icfparguid FROM icfservice
INTO ls_key-icfparguid
WHERE icf_name = ls_key-icf_name
AND icf_cuser <> 'SAP' ##warn_ok.
IF sy-subrc <> 0.
RETURN.
ENDIF.
ENDIF.
ls_key = lcl_tadir=>read_single_sicf( ms_item-obj_name )-obj_name.
cl_icf_tree=>if_icf_tree~get_info_from_serv(
EXPORTING
@ -198,6 +201,7 @@ CLASS lcl_object_sicf IMPLEMENTATION.
ls_read TYPE icfservice,
ls_icfdocu TYPE icfdocu,
lv_url TYPE string,
lv_exists TYPE abap_bool,
lt_icfhandler TYPE TABLE OF icfhandler.
@ -210,14 +214,16 @@ CLASS lcl_object_sicf IMPLEMENTATION.
io_xml->read( EXPORTING iv_name = 'ICFHANDLER_TABLE'
CHANGING cg_data = lt_icfhandler ).
read( IMPORTING es_icfservice = ls_read ).
IF ls_read IS INITIAL.
lv_exists = lif_object~exists( ).
IF lv_exists = abap_false.
insert_sicf( is_icfservice = ls_icfservice
is_icfdocu = ls_icfdocu
it_icfhandler = lt_icfhandler
iv_package = iv_package
iv_url = lv_url ).
ELSE.
read( IMPORTING es_icfservice = ls_read ).
change_sicf( is_icfservice = ls_icfservice
is_icfdocu = ls_icfdocu
it_icfhandler = lt_icfhandler
@ -391,9 +397,21 @@ CLASS lcl_object_sicf IMPLEMENTATION.
DATA: ls_icfservice TYPE icfservice.
read( IMPORTING es_icfservice = ls_icfservice ).
IF ls_icfservice IS INITIAL.
" It seems that the ICF service doesn't exist anymore.
" But that's ok, because some objects like SAPC manage
" the lifecycle of its ICF service by itself and already
" deleted the service.
RETURN.
ENDIF.
IF ls_icfservice-icfparguid CO '0'.
* not supported by the SAP standard API
lcx_exception=>raise( 'SICF - cannot delete root node, delete node manually' ).
ENDIF.
cl_icf_tree=>if_icf_tree~delete_node(
EXPORTING
icfparguid = ls_icfservice-icfparguid
@ -419,7 +437,39 @@ CLASS lcl_object_sicf IMPLEMENTATION.
ENDMETHOD. "delete
METHOD lif_object~jump.
lcx_exception=>raise( 'todo, SICF, jump' ).
DATA: ls_bcdata TYPE bdcdata,
lt_bcdata TYPE STANDARD TABLE OF bdcdata.
ls_bcdata-program = 'RSICFTREE'.
ls_bcdata-dynpro = '1000'.
ls_bcdata-dynbegin = 'X'.
APPEND ls_bcdata TO lt_bcdata.
ls_bcdata-dynpro = space.
ls_bcdata-dynbegin = space.
ls_bcdata-fnam = 'ICF_SERV'.
ls_bcdata-fval = ms_item-obj_name.
APPEND ls_bcdata TO lt_bcdata.
ls_bcdata-fnam = 'BDC_OKCODE'.
ls_bcdata-fval = '=ONLI'.
APPEND ls_bcdata TO lt_bcdata.
CALL FUNCTION 'ABAP4_CALL_TRANSACTION'
STARTING NEW TASK 'GIT'
EXPORTING
tcode = 'SICF'
mode_val = 'E'
TABLES
using_tab = lt_bcdata
EXCEPTIONS
OTHERS = 1.
IF sy-subrc <> 0.
lcx_exception=>raise( 'error from ABAP4_CALL_TRANSACTION, SICF' ).
ENDIF.
ENDMETHOD. "jump
METHOD lif_object~compare_to_remote_version.

View File

@ -67,14 +67,16 @@ CLASS lcl_object_smim IMPLEMENTATION.
METHOD lif_object~exists.
TRY.
get_url_for_io( ).
rv_bool = abap_true.
CATCH lcx_not_found.
rv_bool = abap_false.
ENDTRY.
DATA: lv_loio TYPE sdok_docid.
ENDMETHOD. "lif_object~exists
lv_loio = ms_item-obj_name.
SELECT SINGLE loio_id FROM smimloio INTO lv_loio
WHERE loio_id = lv_loio. "#EC CI_GENBUFF
rv_bool = boolc( sy-subrc = 0 ).
ENDMETHOD.
METHOD get_url_for_io.
@ -206,7 +208,8 @@ CLASS lcl_object_smim IMPLEMENTATION.
ls_file-data = lv_content.
mo_files->add( ls_file ).
SELECT SINGLE lo_class FROM smimloio INTO lv_class WHERE loio_id = lv_loio.
SELECT SINGLE lo_class FROM smimloio INTO lv_class
WHERE loio_id = lv_loio. "#EC CI_GENBUFF
ENDIF.
io_xml->add( iv_name = 'URL'
@ -328,7 +331,13 @@ CLASS lcl_object_smim IMPLEMENTATION.
ENDMETHOD. "delete
METHOD lif_object~jump.
lcx_exception=>raise( 'todo, SMIM, jump' ).
CALL FUNCTION 'RS_TOOL_ACCESS'
EXPORTING
operation = 'SHOW'
object_name = ms_item-obj_name
object_type = ms_item-obj_type.
ENDMETHOD. "jump
METHOD lif_object~compare_to_remote_version.

View File

@ -13,6 +13,9 @@ CLASS lcl_object_ssfo DEFINITION INHERITING FROM lcl_objects_super FINAL.
INTERFACES lif_object.
ALIASES mo_files FOR lif_object~mo_files.
PRIVATE SECTION.
METHODS: fix_ids IMPORTING ii_xml_doc TYPE REF TO if_ixml_document.
ENDCLASS. "lcl_object_dtel DEFINITION
*----------------------------------------------------------------------*
@ -163,16 +166,11 @@ CLASS lcl_object_ssfo IMPLEMENTATION.
li_node->set_value( 'DUMMY' ).
ENDIF.
* remove IDs it seems that they are not used for anything
* the IDs are "random" so it caused diff files
IF lv_name = 'NODE' OR lv_name = 'WINDOW'.
li_attr = li_node->get_attributes( ).
li_attr->remove_named_item( 'ID' ).
ENDIF.
li_node = li_iterator->get_next( ).
ENDWHILE.
fix_ids( li_xml_doc ).
li_element = li_xml_doc->get_root_element( ).
li_element->set_attribute(
name = 'sf'
@ -186,6 +184,54 @@ CLASS lcl_object_ssfo IMPLEMENTATION.
ENDMETHOD. "serialize
METHOD fix_ids.
* makes sure ID and IDREF values are the same values for each serialization run
* the standard code has a counter that keeps increasing values
DATA: lv_name TYPE string,
li_idref TYPE REF TO if_ixml_node,
li_node TYPE REF TO if_ixml_node,
li_attr TYPE REF TO if_ixml_named_node_map,
li_iterator TYPE REF TO if_ixml_node_iterator,
lt_idref TYPE STANDARD TABLE OF string WITH DEFAULT KEY.
li_iterator = ii_xml_doc->create_iterator( ).
li_node = li_iterator->get_next( ).
WHILE NOT li_node IS INITIAL.
lv_name = li_node->get_name( ).
IF lv_name = 'NODE' OR lv_name = 'WINDOW'.
li_idref = li_node->get_attributes( )->get_named_item( 'IDREF' ).
IF li_idref IS BOUND.
APPEND li_idref->get_value( ) TO lt_idref.
li_idref->set_value( |{ sy-tabix }| ).
ENDIF.
ENDIF.
li_node = li_iterator->get_next( ).
ENDWHILE.
li_iterator = ii_xml_doc->create_iterator( ).
li_node = li_iterator->get_next( ).
WHILE NOT li_node IS INITIAL.
lv_name = li_node->get_name( ).
IF lv_name = 'NODE' OR lv_name = 'WINDOW'.
li_idref = li_node->get_attributes( )->get_named_item( 'ID' ).
IF li_idref IS BOUND.
lv_name = li_idref->get_value( ).
READ TABLE lt_idref WITH KEY table_line = lv_name TRANSPORTING NO FIELDS.
IF sy-subrc = 0.
li_idref->set_value( |{ sy-tabix }| ).
ELSE.
li_attr = li_node->get_attributes( ).
li_attr->remove_named_item( 'ID' ).
ENDIF.
ENDIF.
ENDIF.
li_node = li_iterator->get_next( ).
ENDWHILE.
ENDMETHOD.
METHOD lif_object~deserialize.
* see function module FB_UPLOAD_FORM

View File

@ -12,6 +12,7 @@ CLASS lcl_object_ssst DEFINITION INHERITING FROM lcl_objects_super FINAL.
PUBLIC SECTION.
INTERFACES lif_object.
ALIASES mo_files FOR lif_object~mo_files.
CONSTANTS: c_style_active TYPE tdactivate VALUE 'A'.
PRIVATE SECTION.
METHODS validate_font
@ -50,9 +51,11 @@ CLASS lcl_object_ssst IMPLEMENTATION.
DATA: lv_stylename TYPE stxsadm-stylename.
SELECT SINGLE stylename FROM stxsadm INTO lv_stylename
WHERE stylename = ms_item-obj_name.
SELECT SINGLE stylename
FROM stxshead INTO lv_stylename
WHERE active = c_style_active
AND stylename = ms_item-obj_name
AND vari = ''.
rv_bool = boolc( sy-subrc = 0 ).
ENDMETHOD. "lif_object~exists
@ -85,7 +88,7 @@ CLASS lcl_object_ssst IMPLEMENTATION.
CALL FUNCTION 'SSF_READ_STYLE'
EXPORTING
i_style_name = lv_style_name
i_style_active_flag = 'A'
i_style_active_flag = c_style_active
i_style_variant = '%MAIN'
i_style_language = mv_language
IMPORTING
@ -133,10 +136,11 @@ CLASS lcl_object_ssst IMPLEMENTATION.
* see fm SSF_UPLOAD_STYLE
DATA: ls_header TYPE ssfcats,
ls_new_header TYPE ssfcats,
lt_paragraphs TYPE TABLE OF ssfparas,
lt_strings TYPE TABLE OF ssfstrings,
lt_tabstops TYPE TABLE OF stxstab.
FIELD-SYMBOLS: <spras> TYPE spras.
io_xml->read( EXPORTING iv_name = 'HEADER'
CHANGING cg_data = ls_header ).
@ -149,26 +153,47 @@ CLASS lcl_object_ssst IMPLEMENTATION.
validate_font( ls_header-tdfamily ).
CALL FUNCTION 'SSF_READ_STYLE' "Just load FG
EXPORTING
i_style_name = ls_header-stylename
i_style_active_flag = 'A'
EXCEPTIONS
OTHERS = 0.
IF sy-subrc <> 0.
ENDIF.
SET PARAMETER ID 'EUK' FIELD iv_package.
ASSIGN ('(SAPLSTXBS)MASTER_LANGUAGE') TO <spras>.
IF sy-subrc = 0.
<spras> = ls_header-masterlang.
ENDIF.
CALL FUNCTION 'SSF_SAVE_STYLE'
EXPORTING
i_header = ls_header
IMPORTING
e_header = ls_new_header
TABLES
i_paragraphs = lt_paragraphs
i_strings = lt_strings
i_tabstops = lt_tabstops.
CALL FUNCTION 'SSF_ACTIVATE_STYLE'
EXPORTING
i_stylename = ls_header-stylename
EXCEPTIONS
no_name = 1
no_style = 2
cancelled = 3
no_access_permission = 4
illegal_language = 5
OTHERS = 6.
IF sy-subrc <> 0.
lcx_exception=>raise( 'error from SSF_ACTIVATE_STYLE' ).
IF ls_new_header IS NOT INITIAL.
CALL FUNCTION 'SSF_ACTIVATE_STYLE'
EXPORTING
i_stylename = ls_header-stylename
EXCEPTIONS
no_name = 1
no_style = 2
cancelled = 3
no_access_permission = 4
illegal_language = 5
OTHERS = 6.
IF sy-subrc <> 0.
lcx_exception=>raise( 'error from SSF_ACTIVATE_STYLE' ).
ENDIF.
ENDIF.
ENDMETHOD. "deserialize
@ -200,7 +225,39 @@ CLASS lcl_object_ssst IMPLEMENTATION.
ENDMETHOD. "delete
METHOD lif_object~jump.
lcx_exception=>raise( 'todo' ).
DATA: ls_bcdata TYPE bdcdata,
lt_bcdata TYPE STANDARD TABLE OF bdcdata.
ls_bcdata-program = 'SAPMSSFS'.
ls_bcdata-dynpro = '0100'.
ls_bcdata-dynbegin = 'X'.
APPEND ls_bcdata TO lt_bcdata.
CLEAR ls_bcdata.
ls_bcdata-fnam = 'SSFSCREENS-SNAME'.
ls_bcdata-fval = ms_item-obj_name.
APPEND ls_bcdata TO lt_bcdata.
CLEAR ls_bcdata.
ls_bcdata-fnam = 'BDC_OKCODE'.
ls_bcdata-fval = '=DISPLAY'.
APPEND ls_bcdata TO lt_bcdata.
CALL FUNCTION 'ABAP4_CALL_TRANSACTION'
STARTING NEW TASK 'GIT'
EXPORTING
tcode = 'SMARTSTYLES'
mode_val = 'E'
TABLES
using_tab = lt_bcdata
EXCEPTIONS
OTHERS = 1.
IF sy-subrc <> 0.
lcx_exception=>raise( 'error from ABAP4_CALL_TRANSACTION, SSST' ).
ENDIF.
ENDMETHOD. "jump
METHOD lif_object~compare_to_remote_version.

View File

@ -86,7 +86,47 @@ CLASS lcl_object_styl IMPLEMENTATION.
METHOD lif_object~jump.
lcx_exception=>raise( 'todo, STYL jump' ).
DATA: ls_bcdata TYPE bdcdata,
lt_bcdata TYPE STANDARD TABLE OF bdcdata.
ls_bcdata-program = 'SAPMSSCS'.
ls_bcdata-dynpro = '1100'.
ls_bcdata-dynbegin = 'X'.
APPEND ls_bcdata TO lt_bcdata.
CLEAR ls_bcdata.
ls_bcdata-fnam = 'RSSCS-TDSTYLE'.
ls_bcdata-fval = ms_item-obj_name.
APPEND ls_bcdata TO lt_bcdata.
CLEAR ls_bcdata.
ls_bcdata-fnam = 'RSSCS-TDSPRAS'.
ls_bcdata-fval = sy-langu.
APPEND ls_bcdata TO lt_bcdata.
CLEAR ls_bcdata.
ls_bcdata-fnam = 'RSSCS-TDHEADEROB'.
ls_bcdata-fval = 'X'.
APPEND ls_bcdata TO lt_bcdata.
CLEAR ls_bcdata.
ls_bcdata-fnam = 'BDC_OKCODE'.
ls_bcdata-fval = '=SHOW'.
APPEND ls_bcdata TO lt_bcdata.
CALL FUNCTION 'ABAP4_CALL_TRANSACTION'
STARTING NEW TASK 'GIT'
EXPORTING
tcode = 'SE72'
mode_val = 'E'
TABLES
using_tab = lt_bcdata
EXCEPTIONS
OTHERS = 1.
IF sy-subrc <> 0.
lcx_exception=>raise( 'error from ABAP4_CALL_TRANSACTION, STYL' ).
ENDIF.
ENDMETHOD. "jump

View File

@ -79,14 +79,27 @@ CLASS lcl_object_tabl IMPLEMENTATION.
METHOD lif_object~changed_by.
SELECT SINGLE as4user FROM dd02l INTO rv_user
DATA: lv_as4date TYPE dd02l-as4date,
lv_as4time TYPE dd02l-as4time.
SELECT SINGLE as4user as4date as4time
FROM dd02l INTO (rv_user, lv_as4date, lv_as4time)
WHERE tabname = ms_item-obj_name
AND as4local = 'A'
AND as4vers = '0000'.
IF sy-subrc <> 0.
rv_user = c_user_unknown.
RETURN.
ENDIF.
SELECT SINGLE as4user INTO rv_user
FROM dd09l
WHERE tabname = ms_item-obj_name
AND as4local = 'A'
AND as4vers = '0000'
AND ( as4date > lv_as4date OR ( as4date = lv_as4date AND as4time > lv_as4time ) ).
ENDMETHOD.
METHOD lif_object~get_metadata.

View File

@ -13,6 +13,19 @@ CLASS lcl_object_tobj DEFINITION INHERITING FROM lcl_objects_super FINAL.
INTERFACES lif_object.
ALIASES mo_files FOR lif_object~mo_files.
PRIVATE SECTION.
TYPES: BEGIN OF ty_tobj,
tddat TYPE tddat,
tvdir TYPE tvdir,
tvimf TYPE STANDARD TABLE OF tvimf WITH DEFAULT KEY,
END OF ty_tobj.
METHODS:
read_extra IMPORTING iv_tabname TYPE vim_name
RETURNING VALUE(rs_tobj) TYPE ty_tobj,
update_extra IMPORTING is_tobj TYPE ty_tobj,
delete_extra IMPORTING iv_tabname TYPE vim_name.
ENDCLASS. "lcl_object_tobj DEFINITION
*----------------------------------------------------------------------*
@ -22,6 +35,32 @@ ENDCLASS. "lcl_object_tobj DEFINITION
*----------------------------------------------------------------------*
CLASS lcl_object_tobj IMPLEMENTATION.
METHOD read_extra.
SELECT SINGLE * FROM tddat INTO rs_tobj-tddat WHERE tabname = iv_tabname.
SELECT SINGLE * FROM tvdir INTO rs_tobj-tvdir WHERE tabname = iv_tabname.
SELECT * FROM tvimf INTO TABLE rs_tobj-tvimf WHERE tabname = iv_tabname.
ENDMETHOD.
METHOD update_extra.
MODIFY tddat FROM is_tobj-tddat.
MODIFY tvdir FROM is_tobj-tvdir.
MODIFY tvimf FROM TABLE is_tobj-tvimf.
ENDMETHOD.
METHOD delete_extra.
DELETE FROM tddat WHERE tabname = iv_tabname.
DELETE FROM tvdir WHERE tabname = iv_tabname.
DELETE FROM tvimf WHERE tabname = iv_tabname.
ENDMETHOD.
METHOD lif_object~has_changed_since.
rv_changed = abap_true.
ENDMETHOD. "lif_object~has_changed_since
@ -67,6 +106,7 @@ CLASS lcl_object_tobj IMPLEMENTATION.
lt_objs TYPE tt_objs,
lt_objsl TYPE tt_objsl,
lt_objm TYPE tt_objm,
ls_tobj TYPE ty_tobj,
lv_type_pos TYPE i.
lv_type_pos = strlen( ms_item-obj_name ) - 1.
@ -113,6 +153,11 @@ CLASS lcl_object_tobj IMPLEMENTATION.
io_xml->add( iv_name = 'OBJM'
ig_data = lt_objm ).
ls_tobj = read_extra( ls_objh-objectname ).
io_xml->add( iv_name = 'TOBJ'
ig_data = ls_tobj ).
ENDMETHOD. "serialize
METHOD lif_object~deserialize.
@ -121,7 +166,8 @@ CLASS lcl_object_tobj IMPLEMENTATION.
ls_objt TYPE objt,
lt_objs TYPE tt_objs,
lt_objsl TYPE tt_objsl,
lt_objm TYPE tt_objm.
lt_objm TYPE tt_objm,
ls_tobj TYPE ty_tobj.
io_xml->read( EXPORTING iv_name = 'OBJH'
@ -160,6 +206,11 @@ CLASS lcl_object_tobj IMPLEMENTATION.
lcx_exception=>raise( 'error from OBJ_GENERATE' ).
ENDIF.
io_xml->read( EXPORTING iv_name = 'TOBJ'
CHANGING cg_data = ls_tobj ).
update_extra( ls_tobj ).
ENDMETHOD. "deserialize
METHOD lif_object~delete.
@ -188,10 +239,50 @@ CLASS lcl_object_tobj IMPLEMENTATION.
lcx_exception=>raise( 'error from OBJ_GENERATE' ).
ENDIF.
delete_extra( ls_objh-objectname ).
ENDMETHOD. "delete
METHOD lif_object~jump.
lcx_exception=>raise( 'todo, TOBJ jump' ).
DATA: ls_bcdata TYPE bdcdata,
lt_bcdata TYPE STANDARD TABLE OF bdcdata.
ls_bcdata-program = 'SAPMSVIM'.
ls_bcdata-dynpro = '0050'.
ls_bcdata-dynbegin = 'X'.
APPEND ls_bcdata TO lt_bcdata.
CLEAR ls_bcdata.
ls_bcdata-fnam = 'VIMDYNFLDS-VIEWNAME'.
ls_bcdata-fval = substring( val = ms_item-obj_name
len = strlen( ms_item-obj_name ) - 1 ).
APPEND ls_bcdata TO lt_bcdata.
CLEAR ls_bcdata.
ls_bcdata-fnam = 'VIMDYNFLDS-ELEM_GEN'.
ls_bcdata-fval = abap_true.
APPEND ls_bcdata TO lt_bcdata.
CLEAR ls_bcdata.
ls_bcdata-fnam = 'BDC_OKCODE'.
ls_bcdata-fval = '=SHOW'.
APPEND ls_bcdata TO lt_bcdata.
CALL FUNCTION 'ABAP4_CALL_TRANSACTION'
STARTING NEW TASK 'GIT'
EXPORTING
tcode = 'SE54'
mode_val = 'E'
TABLES
using_tab = lt_bcdata
EXCEPTIONS
OTHERS = 1.
IF sy-subrc <> 0.
lcx_exception=>raise( 'error from ABAP4_CALL_TRANSACTION, TOBJ' ).
ENDIF.
ENDMETHOD. "jump
METHOD lif_object~compare_to_remote_version.

View File

@ -41,11 +41,11 @@ CLASS lcl_object_tran DEFINITION INHERITING FROM lcl_objects_super FINAL.
serialize_texts
IMPORTING io_xml TYPE REF TO lcl_xml_output
RAISING lcx_exception,
RAISING lcx_exception,
deserialize_texts
IMPORTING io_xml TYPE REF TO lcl_xml_input
RAISING lcx_exception.
RAISING lcx_exception.
ENDCLASS. "lcl_object_TRAN DEFINITION
@ -443,7 +443,7 @@ CLASS lcl_object_tran IMPLEMENTATION.
INTO CORRESPONDING FIELDS OF TABLE lt_tpool_i18n
FROM tstct
WHERE sprsl <> mv_language
AND tcode = ms_item-obj_name.
AND tcode = ms_item-obj_name. "#EC CI_GENBUFF
IF lines( lt_tpool_i18n ) > 0.
SORT lt_tpool_i18n BY sprsl ASCENDING.

View File

@ -14,6 +14,8 @@ CLASS lcl_object_type DEFINITION INHERITING FROM lcl_objects_super FINAL.
ALIASES mo_files FOR lif_object~mo_files.
PRIVATE SECTION.
CONSTANTS: c_prefix TYPE c LENGTH 3 VALUE '%_C'.
METHODS read
EXPORTING ev_ddtext TYPE ddtypet-ddtext
et_source TYPE abaptxt255_tab
@ -122,10 +124,6 @@ CLASS lcl_object_type IMPLEMENTATION.
lv_typegroup = ms_item-obj_name.
IF lif_object~exists( ) = abap_true.
lif_object~delete( ).
ENDIF.
CALL FUNCTION 'RS_DD_TYGR_INSERT_SOURCES'
EXPORTING
typegroupname = lv_typegroup
@ -145,7 +143,7 @@ CLASS lcl_object_type IMPLEMENTATION.
lcx_exception=>raise( 'error from RS_DD_TYGR_INSERT_SOURCES' ).
ENDIF.
CONCATENATE '%_C' lv_typegroup INTO lv_progname.
CONCATENATE c_prefix lv_typegroup INTO lv_progname.
UPDATE progdir SET uccheck = abap_true
WHERE name = lv_progname.
IF sy-subrc <> 0.
@ -156,8 +154,13 @@ CLASS lcl_object_type IMPLEMENTATION.
METHOD lif_object~deserialize.
DATA: lv_ddtext TYPE ddtypet-ddtext,
lt_source TYPE abaptxt255_tab.
DATA: lv_ddtext TYPE ddtypet-ddtext,
lt_source TYPE abaptxt255_tab,
lv_progname TYPE reposrc-progname,
lv_typegroup TYPE rsedd0-typegroup.
lv_typegroup = ms_item-obj_name.
io_xml->read( EXPORTING iv_name = 'DDTEXT'
@ -165,9 +168,14 @@ CLASS lcl_object_type IMPLEMENTATION.
lt_source = mo_files->read_abap( ).
create( iv_ddtext = lv_ddtext
it_source = lt_source
iv_devclass = iv_package ).
IF lif_object~exists( ) = abap_false.
create( iv_ddtext = lv_ddtext
it_source = lt_source
iv_devclass = iv_package ).
ELSE.
CONCATENATE c_prefix lv_typegroup INTO lv_progname.
INSERT REPORT lv_progname FROM lt_source STATE 'I'.
ENDIF.
lcl_objects_activation=>add_item( ms_item ).

View File

@ -449,13 +449,7 @@ CLASS lcl_objects_files IMPLEMENTATION.
DATA: lv_obj_name TYPE string.
IF ms_item-obj_type = 'SICF'.
* multiple SICF nodes with same name cannot be added to repository
lv_obj_name = ms_item-obj_name(15).
ELSE.
lv_obj_name = ms_item-obj_name.
ENDIF.
lv_obj_name = ms_item-obj_name.
IF iv_extra IS INITIAL.
CONCATENATE lv_obj_name '.' ms_item-obj_type '.' iv_ext
@ -1668,7 +1662,7 @@ CLASS lcl_objects_super IMPLEMENTATION.
li_object TYPE REF TO cl_wb_object,
li_adt TYPE REF TO object,
li_adt_uri_mapper TYPE REF TO object,
li_adt_objref TYPE REF TO object.
li_adt_objref TYPE REF TO object ##needed.
FIELD-SYMBOLS: <uri> TYPE string.
@ -1797,22 +1791,10 @@ CLASS lcl_objects_super IMPLEMENTATION.
METHOD is_adt_jump_possible.
DATA: li_wb_manager TYPE REF TO if_wb_manager,
li_wb_request TYPE REF TO cl_wb_request,
DATA: li_wb_request TYPE REF TO cl_wb_request,
li_adt_uri_mapper_vit TYPE REF TO object,
is_vit_wb_request TYPE abap_bool.
cl_wb_manager=>get_instance(
IMPORTING
p_instance = li_wb_manager
EXCEPTIONS
no_instance = 1
OTHERS = 2 ).
IF sy-subrc <> 0.
lcx_exception=>raise( 'ADT Jump Error' ).
ENDIF.
cl_wb_request=>create_from_object_ref(
EXPORTING
p_wb_object = io_object
@ -1852,6 +1834,381 @@ CLASS lcl_objects_super IMPLEMENTATION.
ENDCLASS. "lcl_objects_super IMPLEMENTATION
CLASS lcl_objects_saxx_super DEFINITION ABSTRACT
INHERITING FROM lcl_objects_super.
* common class for SAPC and SAMC objects
PUBLIC SECTION.
INTERFACES:
lif_object.
PROTECTED SECTION.
METHODS:
get_persistence_class_name ABSTRACT
RETURNING
VALUE(r_persistence_class_name) TYPE seoclsname,
get_data_class_name ABSTRACT
RETURNING
VALUE(r_data_class_name) TYPE seoclsname,
get_data_structure_name ABSTRACT
RETURNING
VALUE(r_data_structure_name) TYPE string.
PRIVATE SECTION.
DATA: mo_persistence TYPE REF TO if_wb_object_persist,
mo_appl_obj_data TYPE REF TO if_wb_object_data_model,
mv_data_structure_name TYPE string,
mv_appl_obj_cls_name TYPE seoclsname,
mv_persistence_cls_name TYPE seoclsname.
METHODS:
create_channel_objects
RAISING
lcx_exception,
get_data
EXPORTING
p_data TYPE any
RAISING
lcx_exception,
lock
RAISING
lcx_exception,
unlock
RAISING
lcx_exception,
get_names.
ENDCLASS.
CLASS lcl_objects_saxx_super IMPLEMENTATION.
METHOD lif_object~has_changed_since.
rv_changed = abap_true.
ENDMETHOD.
METHOD lif_object~changed_by.
DATA: lr_data TYPE REF TO data.
FIELD-SYMBOLS: <ls_data> TYPE any,
<ls_header> TYPE any,
<changed_by> TYPE any.
create_channel_objects( ).
TRY.
CREATE DATA lr_data TYPE (mv_data_structure_name).
ASSIGN lr_data->* TO <ls_data>.
CATCH cx_root.
lcx_exception=>raise( |{ ms_item-obj_name } not supported| ).
ENDTRY.
get_data(
IMPORTING
p_data = <ls_data> ).
ASSIGN COMPONENT 'HEADER' OF STRUCTURE <ls_data> TO <ls_header>.
ASSERT sy-subrc = 0.
ASSIGN COMPONENT 'CHANGED_BY' OF STRUCTURE <ls_header> TO <changed_by>.
ASSERT sy-subrc = 0.
rv_user = <changed_by>.
ENDMETHOD.
METHOD lif_object~get_metadata.
rs_metadata = get_metadata( ).
rs_metadata-delete_tadir = abap_true.
ENDMETHOD.
METHOD lif_object~exists.
DATA: object_key TYPE seu_objkey.
create_channel_objects( ).
object_key = ms_item-obj_name.
TRY.
mo_persistence->get( p_object_key = object_key
p_version = 'A'
p_existence_check_only = abap_true ).
CATCH cx_swb_object_does_not_exist cx_swb_exception.
rv_bool = abap_false.
RETURN.
ENDTRY.
rv_bool = abap_true.
ENDMETHOD.
METHOD lif_object~serialize.
DATA: lr_data TYPE REF TO data.
FIELD-SYMBOLS: <ls_data> TYPE any,
<ls_header> TYPE any,
<field> TYPE any.
create_channel_objects( ).
TRY.
CREATE DATA lr_data TYPE (mv_data_structure_name).
ASSIGN lr_data->* TO <ls_data>.
CATCH cx_root.
lcx_exception=>raise( |{ ms_item-obj_type } not supported| ).
ENDTRY.
get_data(
IMPORTING
p_data = <ls_data> ).
ASSIGN COMPONENT 'HEADER' OF STRUCTURE <ls_data> TO <ls_header>.
ASSERT sy-subrc = 0.
ASSIGN COMPONENT 'CHANGED_ON' OF STRUCTURE <ls_header> TO <field>.
ASSERT sy-subrc = 0.
CLEAR <field>.
ASSIGN COMPONENT 'CHANGED_BY' OF STRUCTURE <ls_header> TO <field>.
ASSERT sy-subrc = 0.
CLEAR <field>.
ASSIGN COMPONENT 'CHANGED_AT' OF STRUCTURE <ls_header> TO <field>.
ASSERT sy-subrc = 0.
CLEAR <field>.
ASSIGN COMPONENT 'CHANGED_CLNT' OF STRUCTURE <ls_header> TO <field>.
ASSERT sy-subrc = 0.
CLEAR <field>.
ASSIGN COMPONENT 'CREATED_ON' OF STRUCTURE <ls_header> TO <field>.
ASSERT sy-subrc = 0.
CLEAR <field>.
ASSIGN COMPONENT 'CREATED_BY' OF STRUCTURE <ls_header> TO <field>.
ASSERT sy-subrc = 0.
CLEAR <field>.
ASSIGN COMPONENT 'CREATED_AT' OF STRUCTURE <ls_header> TO <field>.
ASSERT sy-subrc = 0.
CLEAR <field>.
ASSIGN COMPONENT 'CREATED_CLNT' OF STRUCTURE <ls_header> TO <field>.
ASSERT sy-subrc = 0.
CLEAR <field>.
io_xml->add( iv_name = ms_item-obj_type
ig_data = <ls_data> ).
ENDMETHOD.
METHOD lif_object~deserialize.
DATA: lr_data TYPE REF TO data.
FIELD-SYMBOLS: <ls_data> TYPE any.
create_channel_objects( ).
TRY.
CREATE DATA lr_data TYPE (mv_data_structure_name).
ASSIGN lr_data->* TO <ls_data>.
CATCH cx_root.
lcx_exception=>raise( |{ ms_item-obj_type } not supported| ).
ENDTRY.
io_xml->read(
EXPORTING
iv_name = ms_item-obj_type
CHANGING
cg_data = <ls_data> ).
IF lif_object~exists( ) = abap_true.
lif_object~delete( ).
ENDIF.
TRY.
lock( ).
CALL FUNCTION 'RS_CORR_INSERT'
EXPORTING
object = ms_item-obj_name
object_class = ms_item-obj_type
mode = 'I'
global_lock = abap_true
devclass = iv_package
master_language = mv_language
EXCEPTIONS
cancelled = 1
permission_failure = 2
unknown_objectclass = 3
OTHERS = 4.
IF sy-subrc <> 0.
lcx_exception=>raise( |Error occured while creating { ms_item-obj_type }| ).
ENDIF.
mo_appl_obj_data->set_data( <ls_data> ).
mo_persistence->save( mo_appl_obj_data ).
unlock( ).
CATCH cx_swb_exception.
lcx_exception=>raise( |Error occured while creating { ms_item-obj_type }| ).
ENDTRY.
ENDMETHOD.
METHOD lif_object~delete.
DATA: object_key TYPE seu_objkey.
create_channel_objects( ).
object_key = ms_item-obj_name.
TRY.
lock( ).
mo_persistence->delete( object_key ).
unlock( ).
CATCH cx_swb_exception.
lcx_exception=>raise( |Error occured while deleting { ms_item-obj_type }| ).
ENDTRY.
ENDMETHOD.
METHOD lif_object~jump.
CALL FUNCTION 'RS_TOOL_ACCESS'
EXPORTING
operation = 'SHOW'
object_name = ms_item-obj_name
object_type = ms_item-obj_type.
ENDMETHOD.
METHOD lif_object~compare_to_remote_version.
CREATE OBJECT ro_comparison_result TYPE lcl_comparison_null.
ENDMETHOD.
METHOD create_channel_objects.
get_names( ).
TRY.
IF mo_appl_obj_data IS NOT BOUND.
CREATE OBJECT mo_appl_obj_data TYPE (mv_appl_obj_cls_name).
ENDIF.
IF mo_persistence IS NOT BOUND.
CREATE OBJECT mo_persistence TYPE (mv_persistence_cls_name).
ENDIF.
CATCH cx_root.
lcx_exception=>raise( |{ ms_item-obj_type } not supported| ).
ENDTRY.
ENDMETHOD.
METHOD get_data.
DATA: object_key TYPE seu_objkey.
object_key = ms_item-obj_name.
TRY.
mo_persistence->get(
EXPORTING
p_object_key = object_key
p_version = 'A'
CHANGING
p_object_data = mo_appl_obj_data ).
CATCH cx_root.
lcx_exception=>raise( |{ ms_item-obj_type } not supported| ).
ENDTRY.
mo_appl_obj_data->get_data(
IMPORTING
p_data = p_data ).
ENDMETHOD.
METHOD lock.
DATA: objname TYPE trobj_name,
object_key TYPE seu_objkey,
objtype TYPE trobjtype.
objname = ms_item-obj_name.
object_key = ms_item-obj_name.
objtype = ms_item-obj_type.
mo_persistence->lock(
EXPORTING
p_objname_tr = objname
p_object_key = object_key
p_objtype_tr = objtype
EXCEPTIONS
foreign_lock = 1
error_occurred = 2
OTHERS = 3 ).
IF sy-subrc <> 0.
lcx_exception=>raise( |Error occured while locking { ms_item-obj_type } | && objname ).
ENDIF.
ENDMETHOD. "lock
METHOD unlock.
DATA: objname TYPE trobj_name,
object_key TYPE seu_objkey,
objtype TYPE trobjtype.
objname = ms_item-obj_name.
object_key = ms_item-obj_name.
objtype = ms_item-obj_type.
mo_persistence->unlock( p_objname_tr = objname
p_object_key = object_key
p_objtype_tr = objtype ).
ENDMETHOD. "unlock
METHOD get_names.
IF mv_data_structure_name IS INITIAL.
mv_data_structure_name = get_data_structure_name( ).
ENDIF.
IF mv_appl_obj_cls_name IS INITIAL.
mv_appl_obj_cls_name = get_data_class_name( ).
ENDIF.
IF mv_persistence_cls_name IS INITIAL.
mv_persistence_cls_name = get_persistence_class_name( ).
ENDIF.
ENDMETHOD.
ENDCLASS.
*----------------------------------------------------------------------*
* CLASS lcl_object DEFINITION
*----------------------------------------------------------------------*

View File

@ -133,6 +133,11 @@ CLASS lcl_objects IMPLEMENTATION.
lv_class_name = class_name( is_item ).
ENDIF.
IF lcl_app=>settings( )->read( )->get_experimental_features( ) = abap_true
AND is_item-obj_type = 'CLAS'.
lv_class_name = 'LCL_OBJECT_CLAS_NEW'.
ENDIF.
TRY.
CREATE OBJECT ri_obj TYPE (lv_class_name)
EXPORTING
@ -231,30 +236,23 @@ CLASS lcl_objects IMPLEMENTATION.
METHOD jump.
DATA: li_obj TYPE REF TO lif_object,
adt_jump_enabled TYPE abap_bool.
DATA: li_obj TYPE REF TO lif_object,
lv_adt_jump_enabled TYPE abap_bool.
li_obj = create_object( is_item = is_item
iv_language = lif_defs=>gc_english ).
adt_jump_enabled = lcl_app=>settings( )->read( )->get_adt_jump_enabled( ).
IF adt_jump_enabled = abap_true.
lv_adt_jump_enabled = lcl_app=>settings( )->read( )->get_adt_jump_enabled( ).
IF lv_adt_jump_enabled = abap_true.
TRY.
lcl_objects_super=>jump_adt( i_obj_name = is_item-obj_name
i_obj_type = is_item-obj_type ).
CATCH lcx_exception.
li_obj->jump( ).
ENDTRY.
ELSE.
li_obj->jump( ).
ENDIF.
ENDMETHOD. "jump
@ -589,9 +587,7 @@ CLASS lcl_objects IMPLEMENTATION.
lt_remote = io_repo->get_files_remote( ).
lt_results = lcl_file_status=>status( io_repo ).
DELETE lt_results WHERE
match = abap_true. " Full match
* OR rstate IS INITIAL. " no remote changes, only local
DELETE lt_results WHERE match = abap_true. " Full match
SORT lt_results BY obj_type ASCENDING obj_name ASCENDING.
DELETE ADJACENT DUPLICATES FROM lt_results COMPARING obj_type obj_name.
@ -699,13 +695,19 @@ CLASS lcl_objects IMPLEMENTATION.
ENDMETHOD.
METHOD compare_remote_to_local.
* this method is used for comparing local with remote objects
* before pull, this is useful eg. when overwriting a TABL object.
* only the main XML file is used for comparison
DATA: ls_remote_file TYPE lif_defs=>ty_file,
lo_remote_version TYPE REF TO lcl_xml_input,
lv_count TYPE i,
lo_comparison_result TYPE REF TO lif_comparison_result.
IF is_result-filename CS '.XML'.
FIND ALL OCCURRENCES OF '.' IN is_result-filename MATCH COUNT lv_count.
IF is_result-filename CS '.XML' AND lv_count = 2.
IF io_object->exists( ) = abap_false.
RETURN.
ENDIF.

View File

@ -540,7 +540,7 @@ CLASS lcl_gui_page_boverview IMPLEMENTATION.
CONCATENATE LINES OF it_postdata INTO lv_string.
lt_fields = cl_http_utility=>if_http_utility~string_to_fields( lv_string ).
lt_fields = lcl_html_action_utils=>parse_fields( lv_string ).
READ TABLE lt_fields ASSIGNING <ls_field> WITH KEY name = 'source' ##NO_TEXT.
ASSERT sy-subrc = 0.

View File

@ -40,7 +40,7 @@ CLASS lcl_gui_page_repo_sett IMPLEMENTATION.
DATA lv_serialized_post_data TYPE string.
CONCATENATE LINES OF it_postdata INTO lv_serialized_post_data.
rt_post_fields = cl_http_utility=>if_http_utility~string_to_fields( lv_serialized_post_data ).
rt_post_fields = lcl_html_action_utils=>parse_fields( lv_serialized_post_data ).
ENDMETHOD.

View File

@ -164,6 +164,13 @@ CLASS lcl_gui_page_settings IMPLEMENTATION.
mo_settings->set_run_critical_tests( abap_false ).
ENDIF.
READ TABLE it_post_fields ASSIGNING <ls_post_field> WITH KEY name = 'experimental_features'.
IF sy-subrc = 0.
mo_settings->set_experimental_features( abap_true ).
ELSE.
mo_settings->set_experimental_features( abap_false ).
ENDIF.
READ TABLE it_post_fields ASSIGNING <ls_post_field> WITH KEY name = 'max_lines'.
IF sy-subrc = 0.
lv_i_param_value = <ls_post_field>-value.
@ -219,7 +226,7 @@ CLASS lcl_gui_page_settings IMPLEMENTATION.
DATA lv_serialized_post_data TYPE string.
CONCATENATE LINES OF it_postdata INTO lv_serialized_post_data.
rt_post_fields = cl_http_utility=>if_http_utility~string_to_fields( lv_serialized_post_data ).
rt_post_fields = lcl_html_action_utils=>parse_fields( lv_serialized_post_data ).
ENDMETHOD.
@ -263,16 +270,24 @@ CLASS lcl_gui_page_settings IMPLEMENTATION.
METHOD render_development_internals.
DATA lv_checked TYPE string.
DATA: lv_critical_tests TYPE string,
lv_experimental TYPE string.
IF mo_settings->get_run_critical_tests( ) = abap_true.
lv_checked = 'checked'.
lv_critical_tests = 'checked'.
ENDIF.
IF mo_settings->get_experimental_features( ) = abap_true.
lv_experimental = 'checked'.
ENDIF.
CREATE OBJECT ro_html.
ro_html->add( |<h2>abapGit Development Internals settings</h2>| ).
ro_html->add( `<input type="checkbox" name="critical_tests" value="X" `
&& lv_checked && ` > Enable critical unit tests (see LTCL_DANGEROUS)` ).
ro_html->add( `<input type="checkbox" name="critical_tests" `
&& lv_critical_tests && ` > Enable critical unit tests (see LTCL_DANGEROUS)` ).
ro_html->add( |<br>| ).
ro_html->add( `<input type="checkbox" name="experimental_features" `
&& lv_experimental && ` > Enable experimental features` ).
ro_html->add( |<br>| ).
ro_html->add( |<br>| ).

View File

@ -131,7 +131,7 @@ CLASS lcl_gui_page_stage IMPLEMENTATION.
<ls_item> LIKE LINE OF lt_fields.
CONCATENATE LINES OF it_postdata INTO lv_string.
lt_fields = cl_http_utility=>if_http_utility~string_to_fields( |{ lv_string }| ).
lt_fields = lcl_html_action_utils=>parse_fields( lv_string ).
IF lines( lt_fields ) = 0.
lcx_exception=>raise( 'process_stage_list: empty list' ).
@ -235,6 +235,8 @@ CLASS lcl_gui_page_stage IMPLEMENTATION.
CREATE OBJECT ro_html.
lv_filename = is_file-path && is_file-filename.
* make sure whitespace is preserved in the DOM
REPLACE ALL OCCURRENCES OF ` ` IN lv_filename WITH '&nbsp;'.
ro_html->add( |<tr class="{ iv_context }">| ).

View File

@ -2,6 +2,8 @@
*& Include ZABAPGIT_PERSISTENCE
*&---------------------------------------------------------------------*
CLASS lcl_settings DEFINITION DEFERRED.
CLASS lcl_persist_migrate DEFINITION FINAL.
PUBLIC SECTION.
@ -12,6 +14,8 @@ CLASS lcl_persist_migrate DEFINITION FINAL.
c_text TYPE string VALUE 'Generated by abapGit' ##NO_TEXT.
CLASS-METHODS:
migrate_settings
RAISING lcx_exception,
migrate_repo
RAISING lcx_exception,
migrate_user
@ -23,6 +27,8 @@ CLASS lcl_persist_migrate DEFINITION FINAL.
lock_create
RAISING lcx_exception,
lock_exists
RETURNING VALUE(rv_exists) TYPE abap_bool,
settings_exists
RETURNING VALUE(rv_exists) TYPE abap_bool.
ENDCLASS.
@ -270,6 +276,111 @@ CLASS lcl_persist_background DEFINITION FINAL.
ENDCLASS. "lcl_persistence_background DEFINITION
CLASS lcl_settings DEFINITION FINAL.
PUBLIC SECTION.
CONSTANTS: c_commitmsg_comment_length_dft TYPE i VALUE 50.
CONSTANTS: c_commitmsg_body_size_dft TYPE i VALUE 72.
CONSTANTS: c_dbtype_settings TYPE lcl_persistence_db=>ty_type VALUE 'SETTINGS' ##NO_TEXT.
METHODS: set_proxy_url
IMPORTING
iv_url TYPE string,
set_proxy_port
IMPORTING
iv_port TYPE string,
set_proxy_authentication
IMPORTING
iv_auth TYPE abap_bool,
get_proxy_url
RETURNING
VALUE(rv_proxy_url) TYPE string,
get_proxy_port
RETURNING
VALUE(rv_port) TYPE string,
get_proxy_authentication
RETURNING
VALUE(rv_auth) TYPE abap_bool,
set_run_critical_tests
IMPORTING
iv_run TYPE abap_bool,
get_run_critical_tests
RETURNING
VALUE(rv_run) TYPE abap_bool,
set_experimental_features
IMPORTING
iv_run TYPE abap_bool,
get_experimental_features
RETURNING
VALUE(rv_run) TYPE abap_bool,
set_max_lines
IMPORTING iv_lines TYPE i,
get_max_lines
RETURNING
VALUE(rv_lines) TYPE i,
set_adt_jump_enanbled
IMPORTING
iv_adt_jump_enabled TYPE abap_bool,
get_adt_jump_enabled
RETURNING
VALUE(rv_adt_jump_enabled) TYPE abap_bool,
set_commitmsg_comment_length
IMPORTING
iv_length TYPE i,
get_commitmsg_comment_length
RETURNING
VALUE(rv_length) TYPE i,
set_commitmsg_body_size
IMPORTING
iv_length TYPE i,
get_commitmsg_body_size
RETURNING
VALUE(rv_length) TYPE i,
get_settings_xml
RETURNING
VALUE(ev_settings_xml) TYPE string
RAISING
lcx_exception,
set_xml_settings
IMPORTING
iv_settings_xml TYPE string
RAISING
lcx_exception,
set_defaults.
PRIVATE SECTION.
TYPES: BEGIN OF ty_s_settings,
proxy_url TYPE string,
proxy_port TYPE string,
proxy_auth TYPE string,
run_critical_tests TYPE abap_bool,
experimental_features TYPE abap_bool,
max_lines TYPE i,
adt_jump_enabled TYPE abap_bool,
commitmsg_comment_length TYPE i,
commitmsg_body_size TYPE i,
END OF ty_s_settings.
DATA: ms_settings TYPE ty_s_settings.
ENDCLASS.
CLASS lcl_persist_settings DEFINITION FINAL.
PUBLIC SECTION.
METHODS modify
IMPORTING
io_settings TYPE REF TO lcl_settings
RAISING
lcx_exception.
METHODS read
RETURNING
VALUE(ro_settings) TYPE REF TO lcl_settings.
PRIVATE SECTION.
ENDCLASS.
CLASS lcl_persist_background IMPLEMENTATION.
METHOD constructor.
@ -1286,6 +1397,170 @@ CLASS lcl_persist_migrate IMPLEMENTATION.
migrate_user( ).
ENDIF.
IF settings_exists( ) = abap_false.
migrate_settings( ).
ENDIF.
ENDMETHOD.
METHOD settings_exists.
TRY.
lcl_app=>db( )->read(
iv_type = 'SETTINGS'
iv_value = '' ).
rv_exists = abap_true.
CATCH lcx_not_found.
rv_exists = abap_false.
ENDTRY.
ENDMETHOD.
METHOD migrate_settings.
DATA: lr_settings TYPE REF TO lcl_settings.
DATA: lr_persist_settings TYPE REF TO lcl_persist_settings.
DATA: lv_critical_tests_as_string TYPE string.
DATA: lv_critical_tests_as_boolean TYPE abap_bool.
DATA: lv_max_lines_as_string TYPE string.
DATA: lv_flag TYPE abap_bool.
DATA: lv_max_lines_as_integer TYPE i.
DATA: lv_s_param_value TYPE string.
DATA: lv_i_param_value TYPE i.
DATA: lv_adt_jump_enabled_as_string TYPE string.
DATA: lv_adt_jump_enabled_as_boolean TYPE abap_bool.
CREATE OBJECT lr_persist_settings.
CREATE OBJECT lr_settings.
lr_settings->set_defaults( ).
TRY.
lr_settings->set_proxy_url(
lcl_app=>db( )->read(
iv_type = 'SETTINGS'
iv_value = 'PROXY_URL' ) ).
CATCH lcx_not_found.
ENDTRY.
TRY.
lr_settings->set_proxy_port(
lcl_app=>db( )->read(
iv_type = 'SETTINGS'
iv_value = 'PROXY_PORT' ) ).
CATCH lcx_not_found.
ENDTRY.
TRY.
lv_flag = lcl_app=>db( )->read(
iv_type = 'SETTINGS'
iv_value = 'PROXY_AUTH' ).
lr_settings->set_proxy_authentication( lv_flag ).
CATCH lcx_not_found.
ENDTRY.
TRY.
lv_critical_tests_as_string = lcl_app=>db( )->read(
iv_type = 'SETTINGS'
iv_value = 'CRIT_TESTS' ).
lv_critical_tests_as_boolean = lv_critical_tests_as_string.
lr_settings->set_run_critical_tests( lv_critical_tests_as_boolean ).
CATCH lcx_not_found.
ENDTRY.
TRY.
lv_max_lines_as_string = lcl_app=>db( )->read(
iv_type = 'SETTINGS'
iv_value = 'MAX_LINES' ).
lv_max_lines_as_integer = lv_max_lines_as_string.
lr_settings->set_max_lines( lv_max_lines_as_integer ).
CATCH lcx_not_found cx_sy_conversion_no_number.
ENDTRY.
TRY.
lv_adt_jump_enabled_as_string = lcl_app=>db( )->read(
iv_type = 'SETTINGS'
iv_value = 'ADT_JUMP' ).
lv_adt_jump_enabled_as_boolean = lv_adt_jump_enabled_as_string.
lr_settings->set_adt_jump_enanbled( lv_adt_jump_enabled_as_boolean ).
CATCH lcx_not_found.
ENDTRY.
TRY.
lv_s_param_value = lcl_app=>db( )->read(
iv_type = 'SETTINGS'
iv_value = 'COMMENT_LEN' ).
lv_i_param_value = lv_s_param_value.
lr_settings->set_commitmsg_comment_length( lv_i_param_value ).
CATCH lcx_not_found cx_sy_conversion_no_number.
ENDTRY.
TRY.
lv_s_param_value = lcl_app=>db( )->read(
iv_type = 'SETTINGS'
iv_value = 'BODY_SIZE' ).
lv_i_param_value = lv_s_param_value.
lr_settings->set_commitmsg_body_size( lv_i_param_value ).
CATCH lcx_not_found cx_sy_conversion_no_number.
ENDTRY.
lr_persist_settings->modify( io_settings = lr_settings ).
TRY.
lcl_app=>db( )->delete(
iv_type = 'SETTINGS'
iv_value = 'PROXY_URL' ).
CATCH lcx_exception.
ENDTRY.
TRY.
lcl_app=>db( )->delete(
iv_type = 'SETTINGS'
iv_value = 'PROXY_PORT' ).
CATCH lcx_exception.
ENDTRY.
TRY.
lcl_app=>db( )->delete(
iv_type = 'SETTINGS'
iv_value = 'PROXY_AUTH' ).
CATCH lcx_exception.
ENDTRY.
TRY.
lcl_app=>db( )->delete(
iv_type = 'SETTINGS'
iv_value = 'CRIT_TESTS' ).
CATCH lcx_exception.
ENDTRY.
TRY.
lcl_app=>db( )->delete(
iv_type = 'SETTINGS'
iv_value = 'MAX_LINES' ).
CATCH lcx_exception.
ENDTRY.
TRY.
lcl_app=>db( )->delete(
iv_type = 'SETTINGS'
iv_value = 'ADT_JUMP' ).
CATCH lcx_exception.
ENDTRY.
TRY.
lcl_app=>db( )->delete(
iv_type = 'SETTINGS'
iv_value = 'COMMENT_LEN' ).
CATCH lcx_exception.
ENDTRY.
TRY.
lcl_app=>db( )->delete(
iv_type = 'SETTINGS'
iv_value = 'BODY_SIZE' ).
CATCH lcx_exception.
ENDTRY.
ENDMETHOD.
METHOD migrate_repo.
@ -1531,148 +1806,119 @@ CLASS lcl_persist_migrate IMPLEMENTATION.
ENDCLASS.
CLASS lcl_settings DEFINITION FINAL.
PUBLIC SECTION.
CONSTANTS: c_commitmsg_comment_length_dft TYPE i VALUE 50.
CONSTANTS: c_commitmsg_body_size_dft TYPE i VALUE 72.
METHODS set_proxy_url
IMPORTING
iv_url TYPE string.
METHODS set_proxy_port
IMPORTING
iv_port TYPE string.
METHODS set_proxy_authentication
IMPORTING
iv_auth TYPE abap_bool.
METHODS get_proxy_url
RETURNING
VALUE(rv_proxy_url) TYPE string.
METHODS get_proxy_port
RETURNING
VALUE(rv_port) TYPE string.
METHODS get_proxy_authentication
RETURNING
VALUE(rv_auth) TYPE abap_bool.
METHODS set_run_critical_tests
IMPORTING
iv_run TYPE abap_bool.
METHODS
get_run_critical_tests
RETURNING VALUE(rv_run) TYPE abap_bool.
METHODS set_max_lines
IMPORTING iv_lines TYPE i.
METHODS get_max_lines
RETURNING
VALUE(rv_lines) TYPE i.
METHODS set_adt_jump_enanbled
IMPORTING iv_adt_jump_enabled TYPE abap_bool.
METHODS get_adt_jump_enabled
RETURNING
VALUE(rv_adt_jump_enabled) TYPE abap_bool.
METHODS set_commitmsg_comment_length
IMPORTING iv_length TYPE i.
METHODS get_commitmsg_comment_length
RETURNING
VALUE(rv_length) TYPE i.
METHODS set_commitmsg_body_size
IMPORTING iv_length TYPE i.
METHODS get_commitmsg_body_size
RETURNING
VALUE(rv_length) TYPE i.
PRIVATE SECTION.
DATA: mv_proxy_url TYPE string,
mv_proxy_port TYPE string,
mv_proxy_auth TYPE string,
mv_run_critical_tests TYPE abap_bool,
mv_lines TYPE i,
mv_adt_jump_enabled TYPE abap_bool,
mv_commitmsg_comment_length TYPE i,
mv_commitmsg_body_size TYPE i.
ENDCLASS.
CLASS lcl_settings IMPLEMENTATION.
METHOD set_proxy_authentication.
mv_proxy_auth = iv_auth.
ms_settings-proxy_auth = iv_auth.
ENDMETHOD.
METHOD get_proxy_authentication.
rv_auth = mv_proxy_auth.
rv_auth = ms_settings-proxy_auth.
ENDMETHOD.
METHOD set_proxy_url.
mv_proxy_url = iv_url.
ms_settings-proxy_url = iv_url.
ENDMETHOD.
METHOD get_proxy_url.
rv_proxy_url = mv_proxy_url.
rv_proxy_url = ms_settings-proxy_url.
ENDMETHOD.
METHOD set_proxy_port.
mv_proxy_port = iv_port.
ms_settings-proxy_port = iv_port.
ENDMETHOD.
METHOD get_proxy_port.
rv_port = mv_proxy_port.
rv_port = ms_settings-proxy_port.
ENDMETHOD.
METHOD set_run_critical_tests.
mv_run_critical_tests = iv_run.
ms_settings-run_critical_tests = iv_run.
ENDMETHOD.
METHOD get_run_critical_tests.
rv_run = mv_run_critical_tests.
rv_run = ms_settings-run_critical_tests.
ENDMETHOD.
METHOD set_experimental_features.
ms_settings-experimental_features = iv_run.
ENDMETHOD.
METHOD get_experimental_features.
rv_run = ms_settings-experimental_features.
ENDMETHOD.
METHOD get_max_lines.
rv_lines = mv_lines.
rv_lines = ms_settings-max_lines.
ENDMETHOD.
METHOD set_max_lines.
mv_lines = iv_lines.
ms_settings-max_lines = iv_lines.
ENDMETHOD.
METHOD get_adt_jump_enabled.
rv_adt_jump_enabled = mv_adt_jump_enabled.
rv_adt_jump_enabled = ms_settings-adt_jump_enabled.
ENDMETHOD.
METHOD set_adt_jump_enanbled.
mv_adt_jump_enabled = iv_adt_jump_enabled.
ms_settings-adt_jump_enabled = iv_adt_jump_enabled.
ENDMETHOD.
METHOD get_commitmsg_comment_length.
rv_length = mv_commitmsg_comment_length.
rv_length = ms_settings-commitmsg_comment_length.
ENDMETHOD.
METHOD set_commitmsg_comment_length.
mv_commitmsg_comment_length = iv_length.
ms_settings-commitmsg_comment_length = iv_length.
ENDMETHOD.
METHOD get_commitmsg_body_size.
rv_length = mv_commitmsg_body_size.
rv_length = ms_settings-commitmsg_body_size.
ENDMETHOD.
METHOD set_commitmsg_body_size.
mv_commitmsg_body_size = iv_length.
ms_settings-commitmsg_body_size = iv_length.
ENDMETHOD.
ENDCLASS.
METHOD get_settings_xml.
CLASS lcl_persist_settings DEFINITION FINAL.
DATA: lr_output TYPE REF TO lcl_xml_output.
PUBLIC SECTION.
METHODS modify
IMPORTING
io_settings TYPE REF TO lcl_settings
RAISING
lcx_exception.
METHODS read
RETURNING
VALUE(ro_settings) TYPE REF TO lcl_settings.
CREATE OBJECT lr_output.
lr_output->add( iv_name = lcl_settings=>c_dbtype_settings
ig_data = ms_settings ).
ev_settings_xml = lr_output->render( ).
ENDMETHOD.
METHOD set_xml_settings.
DATA: lr_input TYPE REF TO lcl_xml_input.
CREATE OBJECT lr_input EXPORTING iv_xml = iv_settings_xml.
CLEAR ms_settings.
lr_input->read( EXPORTING iv_name = lcl_settings=>c_dbtype_settings
CHANGING cg_data = ms_settings ).
ENDMETHOD.
METHOD set_defaults.
CLEAR ms_settings.
set_proxy_authentication( abap_false ).
set_run_critical_tests( abap_false ).
set_experimental_features( abap_false ).
set_max_lines( 500 ).
set_adt_jump_enanbled( abap_false ).
set_commitmsg_comment_length( lcl_settings=>c_commitmsg_comment_length_dft ).
set_commitmsg_body_size( lcl_settings=>c_commitmsg_body_size_dft ).
ENDMETHOD.
ENDCLASS.
@ -1680,140 +1926,27 @@ CLASS lcl_persist_settings IMPLEMENTATION.
METHOD modify.
* todo, refactor this class to use XML and only 1 row in the database?
lcl_app=>db( )->modify(
iv_type = 'SETTINGS'
iv_value = 'PROXY_URL'
iv_data = io_settings->get_proxy_url( ) ).
lcl_app=>db( )->modify(
iv_type = 'SETTINGS'
iv_value = 'PROXY_PORT'
iv_data = io_settings->get_proxy_port( ) ).
lcl_app=>db( )->modify(
iv_type = 'SETTINGS'
iv_value = 'PROXY_AUTH'
iv_data = io_settings->get_proxy_authentication( ) ).
lcl_app=>db( )->modify(
iv_type = 'SETTINGS'
iv_value = 'CRIT_TESTS'
iv_data = io_settings->get_run_critical_tests( ) ).
lcl_app=>db( )->modify(
iv_type = 'SETTINGS'
iv_value = 'MAX_LINES'
iv_data = |{ io_settings->get_max_lines( ) }| ).
lcl_app=>db( )->modify(
iv_type = 'SETTINGS'
iv_value = 'ADT_JUMP'
iv_data = io_settings->get_adt_jump_enabled( ) ).
lcl_app=>db( )->modify(
iv_type = 'SETTINGS'
iv_value = 'COMMENT_LEN'
iv_data = |{ io_settings->get_commitmsg_comment_length( ) }| ).
lcl_app=>db( )->modify(
iv_type = 'SETTINGS'
iv_value = 'BODY_SIZE'
iv_data = |{ io_settings->get_commitmsg_body_size( ) }| ).
iv_type = lcl_settings=>c_dbtype_settings
iv_value = ''
iv_data = io_settings->get_settings_xml( ) ).
ENDMETHOD.
METHOD read.
DATA: lv_critical_tests_as_string TYPE string,
lv_critical_tests_as_boolean TYPE abap_bool,
lv_max_lines_as_string TYPE string,
lv_flag TYPE abap_bool,
lv_max_lines_as_integer TYPE i,
lv_s_param_value TYPE string,
lv_i_param_value TYPE i,
lv_adt_jump_enabled_as_string TYPE string,
lv_adt_jump_enabled_as_boolean TYPE abap_bool.
CREATE OBJECT ro_settings.
TRY.
ro_settings->set_proxy_url(
lcl_app=>db( )->read(
iv_type = 'SETTINGS'
iv_value = 'PROXY_URL' ) ).
CATCH lcx_not_found.
ro_settings->set_proxy_url( '' ).
ENDTRY.
TRY.
ro_settings->set_proxy_port(
lcl_app=>db( )->read(
iv_type = 'SETTINGS'
iv_value = 'PROXY_PORT' ) ).
CATCH lcx_not_found.
ro_settings->set_proxy_port( '' ).
ENDTRY.
ro_settings->set_xml_settings(
lcl_app=>db( )->read( iv_type = lcl_settings=>c_dbtype_settings
iv_value = '' ) ).
TRY.
lv_flag = lcl_app=>db( )->read(
iv_type = 'SETTINGS'
iv_value = 'PROXY_AUTH' ).
ro_settings->set_proxy_authentication( lv_flag ).
CATCH lcx_not_found.
ro_settings->set_proxy_authentication( abap_false ).
ENDTRY.
CATCH lcx_not_found lcx_exception.
TRY.
lv_critical_tests_as_string = lcl_app=>db( )->read(
iv_type = 'SETTINGS'
iv_value = 'CRIT_TESTS' ).
lv_critical_tests_as_boolean = lv_critical_tests_as_string.
ro_settings->set_run_critical_tests( lv_critical_tests_as_boolean ).
CATCH lcx_not_found.
ro_settings->set_run_critical_tests( abap_false ).
ENDTRY.
ro_settings->set_defaults( ).
TRY.
lv_max_lines_as_string = lcl_app=>db( )->read(
iv_type = 'SETTINGS'
iv_value = 'MAX_LINES' ).
lv_max_lines_as_integer = lv_max_lines_as_string.
ro_settings->set_max_lines( lv_max_lines_as_integer ).
CATCH lcx_not_found cx_sy_conversion_no_number.
ro_settings->set_max_lines( 500 ). " default
ENDTRY.
TRY.
lv_adt_jump_enabled_as_string = lcl_app=>db( )->read(
iv_type = 'SETTINGS'
iv_value = 'ADT_JUMP' ).
lv_adt_jump_enabled_as_boolean = lv_adt_jump_enabled_as_string.
ro_settings->set_adt_jump_enanbled( lv_adt_jump_enabled_as_boolean ).
CATCH lcx_not_found.
ro_settings->set_adt_jump_enanbled( abap_false ).
ENDTRY.
TRY.
lv_s_param_value = lcl_app=>db( )->read(
iv_type = 'SETTINGS'
iv_value = 'COMMENT_LEN' ).
lv_i_param_value = lv_s_param_value.
ro_settings->set_commitmsg_comment_length( lv_i_param_value ).
CATCH lcx_not_found cx_sy_conversion_no_number.
ro_settings->set_commitmsg_comment_length( lcl_settings=>c_commitmsg_comment_length_dft ). " default
ENDTRY.
TRY.
lv_s_param_value = lcl_app=>db( )->read(
iv_type = 'SETTINGS'
iv_value = 'BODY_SIZE' ).
lv_i_param_value = lv_s_param_value.
ro_settings->set_commitmsg_body_size( lv_i_param_value ).
CATCH lcx_not_found cx_sy_conversion_no_number.
ro_settings->set_commitmsg_body_size( lcl_settings=>c_commitmsg_body_size_dft ). " default
ENDTRY.
ENDMETHOD.

View File

@ -42,21 +42,21 @@ CLASS lcl_repo DEFINITION ABSTRACT FRIENDS lcl_repo_srv.
RETURNING VALUE(ro_dot_abapgit) TYPE REF TO lcl_dot_abapgit,
set_dot_abapgit
IMPORTING io_dot_abapgit TYPE REF TO lcl_dot_abapgit
RAISING lcx_exception,
RAISING lcx_exception,
deserialize
RAISING lcx_exception,
refresh
IMPORTING iv_drop_cache TYPE abap_bool DEFAULT abap_false
RAISING lcx_exception,
RAISING lcx_exception,
refresh_local, " For testing purposes, maybe removed later
update_local_checksums
IMPORTING it_files TYPE lif_defs=>ty_file_signatures_tt
RAISING lcx_exception,
rebuild_local_checksums
RAISING lcx_exception,
RAISING lcx_exception,
find_remote_dot_abapgit
RETURNING VALUE(ro_dot) TYPE REF TO lcl_dot_abapgit
RAISING lcx_exception,
RAISING lcx_exception,
is_offline
RETURNING VALUE(rv_offline) TYPE abap_bool
RAISING lcx_exception.
@ -108,7 +108,7 @@ CLASS lcl_repo_online DEFINITION INHERITING FROM lcl_repo FINAL.
IMPORTING iv_branch_name TYPE lcl_persistence_repo=>ty_repo-branch_name
RAISING lcx_exception,
set_new_remote
IMPORTING iv_url TYPE lcl_persistence_repo=>ty_repo-url
IMPORTING iv_url TYPE lcl_persistence_repo=>ty_repo-url
iv_branch_name TYPE lcl_persistence_repo=>ty_repo-branch_name
RAISING lcx_exception,
get_sha1_local
@ -130,7 +130,12 @@ CLASS lcl_repo_online DEFINITION INHERITING FROM lcl_repo FINAL.
push
IMPORTING is_comment TYPE lif_defs=>ty_comment
io_stage TYPE REF TO lcl_stage
RAISING lcx_exception.
RAISING lcx_exception,
get_unnecessary_local_objs
RETURNING VALUE(rt_unnecessary_local_objects) TYPE LIF_DEFS=>TY_TADIR_TT
RAISING lcx_exception,
delete_unnecessary_local_objs
RAISING lcx_exception lcx_cancel.
PRIVATE SECTION.
DATA:
@ -149,8 +154,8 @@ CLASS lcl_repo_online DEFINITION INHERITING FROM lcl_repo FINAL.
actualize_head_branch
RAISING lcx_exception,
delete_initial_online_repo
importing iv_commit type flag
RAISING lcx_exception.
IMPORTING iv_commit TYPE flag
RAISING lcx_exception.
ENDCLASS. "lcl_repo_online DEFINITION

View File

@ -321,6 +321,61 @@ CLASS lcl_repo_online IMPLEMENTATION.
ENDMETHOD. " delete_initial_online_repo
METHOD delete_unnecessary_local_objs.
DATA: lt_tadir TYPE lif_defs=>ty_tadir_tt.
lt_tadir = get_unnecessary_local_objs( ).
IF lines( lt_tadir ) > 0.
lcl_objects=>delete( lt_tadir ).
ENDIF.
ENDMETHOD. " delete_unneccessary_local_objs.
METHOD get_unnecessary_local_objs.
DATA: lt_tadir TYPE lif_defs=>ty_tadir_tt,
lt_tadir_unique TYPE HASHED TABLE OF lif_defs=>ty_tadir
WITH UNIQUE KEY pgmid object obj_name,
lt_local TYPE lif_defs=>ty_files_item_tt,
lt_remote TYPE lif_defs=>ty_files_tt,
lt_status TYPE lif_defs=>ty_results_tt,
lt_package TYPE lcl_persistence_repo=>ty_repo-package.
FIELD-SYMBOLS: <status> TYPE lif_defs=>ty_result,
<tadir> TYPE lif_defs=>ty_tadir.
" delete objects which are added locally but are not in remote repo
lt_local = me->get_files_local( ).
lt_remote = me->get_files_remote( ).
lt_status = me->status( ).
lt_package = me->get_package( ).
lt_tadir = lcl_tadir=>read( lt_package ).
LOOP AT lt_status ASSIGNING <status>
WHERE lstate = lif_defs=>gc_state-added.
READ TABLE lt_tadir ASSIGNING <tadir>
WITH KEY pgmid = 'R3TR'
object = <status>-obj_type
obj_name = <status>-obj_name
devclass = <status>-package
BINARY SEARCH.
ASSERT sy-subrc = 0.
INSERT <tadir> INTO TABLE lt_tadir_unique.
ENDLOOP.
rt_unnecessary_local_objects = lt_tadir_unique.
ENDMETHOD.
ENDCLASS. "lcl_repo_online IMPLEMENTATION
*----------------------------------------------------------------------*
@ -908,9 +963,14 @@ CLASS lcl_repo_srv IMPLEMENTATION.
lcx_exception=>raise( 'not possible to use $TMP, create new (local) package' ).
ENDIF.
SELECT SINGLE devclass FROM tdevc INTO lv_devclass
WHERE devclass = iv_package
AND as4user <> 'SAP'. "#EC CI_GENBUFF
IF lcl_exit=>get_instance( )->allow_sap_objects( ) = abap_true.
SELECT SINGLE devclass FROM tdevc INTO lv_devclass
WHERE devclass = iv_package. "#EC CI_GENBUFF
ELSE.
SELECT SINGLE devclass FROM tdevc INTO lv_devclass
WHERE devclass = iv_package
AND as4user <> 'SAP'. "#EC CI_GENBUFF
ENDIF.
IF sy-subrc <> 0.
lcx_exception=>raise( 'package not found or not allowed' ).
ENDIF.

View File

@ -49,7 +49,6 @@ CLASS lcl_services_db IMPLEMENTATION.
METHOD update.
ASSERT is_content-type IS NOT INITIAL.
ASSERT is_content-value IS NOT INITIAL.
lcl_app=>db( )->update(
iv_type = is_content-type

View File

@ -47,9 +47,9 @@ CLASS lcl_services_git IMPLEMENTATION.
METHOD reset.
DATA: lo_repo TYPE REF TO lcl_repo_online,
lv_answer TYPE c LENGTH 1.
DATA: lo_repo TYPE REF TO lcl_repo_online,
lv_answer TYPE c LENGTH 1,
lt_unnecessary_local_objs TYPE lif_defs=>ty_tadir_tt.
lo_repo ?= lcl_app=>repo_srv( )->get( iv_key ).
@ -71,6 +71,26 @@ CLASS lcl_services_git IMPLEMENTATION.
RAISE EXCEPTION TYPE lcx_cancel.
ENDIF.
lt_unnecessary_local_objs = lo_repo->get_unnecessary_local_objs( ).
IF lines( lt_unnecessary_local_objs ) > 0.
lv_answer = lcl_popups=>popup_to_confirm(
titlebar = 'Question'
text_question = |Delete { lines( lt_unnecessary_local_objs ) } unnecessary local objects?|
text_button_1 = 'Yes'
icon_button_1 = 'ICON_OKAY'
text_button_2 = 'No'
icon_button_2 = 'ICON_CANCEL'
default_button = '2'
display_cancel_button = abap_false ). "#EC NOTEXT
IF lv_answer = '1'.
lo_repo->delete_unnecessary_local_objs( ).
ENDIF.
ENDIF.
lo_repo->deserialize( ).
ENDMETHOD.

View File

@ -21,15 +21,26 @@ CLASS lcl_tadir DEFINITION FINAL.
IMPORTING iv_pgmid TYPE tadir-pgmid DEFAULT 'R3TR'
iv_object TYPE tadir-object
iv_obj_name TYPE tadir-obj_name
RETURNING VALUE(rs_tadir) TYPE tadir,
RETURNING VALUE(rs_tadir) TYPE tadir
RAISING lcx_exception,
read_single_sicf
IMPORTING iv_pgmid TYPE tadir-pgmid DEFAULT 'R3TR'
iv_obj_name TYPE tadir-obj_name
RETURNING VALUE(rs_tadir) TYPE tadir
RAISING lcx_exception,
get_object_package
IMPORTING iv_pgmid TYPE tadir-pgmid DEFAULT 'R3TR'
iv_object TYPE tadir-object
iv_obj_name TYPE tadir-obj_name
RETURNING VALUE(rv_devclass) TYPE tadir-devclass.
RETURNING VALUE(rv_devclass) TYPE tadir-devclass
RAISING lcx_exception.
PRIVATE SECTION.
CLASS-METHODS:
read_sicf_url
IMPORTING iv_obj_name TYPE tadir-obj_name
RETURNING VALUE(rv_hash) TYPE text25
RAISING lcx_exception,
check_exists
IMPORTING it_tadir TYPE lif_defs=>ty_tadir_tt
RETURNING VALUE(rt_tadir) TYPE lif_defs=>ty_tadir_tt
@ -57,18 +68,49 @@ CLASS lcl_tadir IMPLEMENTATION.
IF iv_object = 'SICF'.
CONCATENATE iv_obj_name '%' INTO lv_obj_name.
rs_tadir = read_single_sicf( iv_pgmid = iv_pgmid
iv_obj_name = iv_obj_name ).
ELSE.
lv_obj_name = iv_obj_name.
SELECT SINGLE * FROM tadir INTO rs_tadir
WHERE pgmid = iv_pgmid
AND object = iv_object
AND obj_name = iv_obj_name. "#EC CI_SUBRC
ENDIF.
SELECT SINGLE * FROM tadir INTO rs_tadir
WHERE pgmid = iv_pgmid
AND object = iv_object
AND obj_name LIKE lv_obj_name. "#EC CI_SUBRC "#EC CI_GENBUFF
ENDMETHOD. "read_single
METHOD read_single_sicf.
DATA: lt_tadir TYPE STANDARD TABLE OF tadir WITH DEFAULT KEY,
lv_hash TYPE text25,
lv_obj_name TYPE tadir-obj_name.
FIELD-SYMBOLS: <ls_tadir> LIKE LINE OF lt_tadir.
lv_hash = iv_obj_name+15.
CONCATENATE iv_obj_name(15) '%' INTO lv_obj_name.
SELECT * FROM tadir INTO TABLE lt_tadir
WHERE pgmid = iv_pgmid
AND object = 'SICF'
AND obj_name LIKE lv_obj_name.
LOOP AT lt_tadir ASSIGNING <ls_tadir>.
IF read_sicf_url( <ls_tadir>-obj_name ) = lv_hash.
rs_tadir = <ls_tadir>.
RETURN.
ENDIF.
ENDLOOP.
IF lines( lt_tadir ) = 1.
READ TABLE lt_tadir INDEX 1 ASSIGNING <ls_tadir>.
ASSERT sy-subrc = 0.
rs_tadir = <ls_tadir>.
ENDIF.
ENDMETHOD.
METHOD get_object_package.
DATA ls_tadir TYPE tadir.
@ -85,6 +127,34 @@ CLASS lcl_tadir IMPLEMENTATION.
ENDMETHOD. "get_object_package.
METHOD read_sicf_url.
DATA: lv_name TYPE icfname,
lv_url TYPE string,
lv_parguid TYPE icfparguid.
lv_name = iv_obj_name.
lv_parguid = iv_obj_name+15.
cl_icf_tree=>if_icf_tree~get_info_from_serv(
EXPORTING
icf_name = lv_name
icfparguid = lv_parguid
IMPORTING
url = lv_url
EXCEPTIONS
wrong_name = 1
wrong_parguid = 2
incorrect_service = 3
no_authority = 4
OTHERS = 5 ).
IF sy-subrc = 0.
rv_hash = lcl_hash=>sha1_raw( lcl_convert=>string_to_xstring_utf8( lv_url ) ).
ENDIF.
ENDMETHOD.
METHOD check_exists.
DATA: lv_exists TYPE abap_bool,
@ -126,9 +196,9 @@ CLASS lcl_tadir IMPLEMENTATION.
METHOD build.
DATA: lt_tadir TYPE lif_defs=>ty_tadir_tt,
lt_tdevc TYPE STANDARD TABLE OF tdevc,
lv_path TYPE string.
DATA: lt_tadir TYPE lif_defs=>ty_tadir_tt,
lt_tdevc TYPE STANDARD TABLE OF tdevc,
lv_path TYPE string.
FIELD-SYMBOLS: <ls_tdevc> LIKE LINE OF lt_tdevc,
<ls_tadir> LIKE LINE OF rt_tadir.
@ -137,6 +207,7 @@ CLASS lcl_tadir IMPLEMENTATION.
SELECT * FROM tadir
INTO CORRESPONDING FIELDS OF TABLE rt_tadir
WHERE devclass = iv_package
AND pgmid = 'R3TR'
AND object <> 'DEVC'
AND object <> 'SOTR'
AND object <> 'SFB1'
@ -157,7 +228,8 @@ CLASS lcl_tadir IMPLEMENTATION.
CASE <ls_tadir>-object.
WHEN 'SICF'.
<ls_tadir>-obj_name = <ls_tadir>-obj_name(15).
* replace the internal GUID with a hash of the path
<ls_tadir>-obj_name+15 = read_sicf_url( <ls_tadir>-obj_name ).
ENDCASE.
ENDLOOP.

View File

@ -62,6 +62,7 @@ ENDCLASS. "ltcl_convert DEFINITION
CLASS ltcl_convert IMPLEMENTATION.
METHOD convert_int.
DATA: lv_xstring TYPE xstring,
lv_input TYPE i,
lv_result TYPE i.
@ -69,8 +70,7 @@ CLASS ltcl_convert IMPLEMENTATION.
DO 1000 TIMES.
lv_input = sy-index.
lv_xstring = lcl_convert=>int_to_xstring( iv_i = lv_input
iv_length = 4 ).
lv_xstring = lcl_convert=>int_to_xstring4( lv_input ).
lv_result = lcl_convert=>xstring_to_int( lv_xstring ).
cl_abap_unit_assert=>assert_equals(
@ -1004,9 +1004,6 @@ CLASS ltcl_git_pack_decode_commit IMPLEMENTATION.
cl_abap_unit_assert=>assert_equals(
act = ms_raw-committer
exp = 'committer' ).
cl_abap_unit_assert=>assert_equals(
act = ms_raw-body
exp = 'comment' ).
cl_abap_unit_assert=>assert_equals(
act = ms_raw-parent
exp = 'parent1' ).
@ -1014,6 +1011,10 @@ CLASS ltcl_git_pack_decode_commit IMPLEMENTATION.
act = ms_raw-parent2
exp = 'parent2' ).
cl_abap_unit_assert=>assert_char_cp(
act = ms_raw-body
exp = 'comment+' ).
ENDMETHOD.
METHOD decode2.
@ -1035,13 +1036,14 @@ CLASS ltcl_git_pack_decode_commit IMPLEMENTATION.
cl_abap_unit_assert=>assert_equals(
act = ms_raw-committer
exp = 'committer' ).
cl_abap_unit_assert=>assert_equals(
act = ms_raw-body
exp = 'comment' ).
cl_abap_unit_assert=>assert_equals(
act = ms_raw-parent
exp = '' ).
cl_abap_unit_assert=>assert_char_cp(
act = ms_raw-body
exp = 'comment+' ).
ENDMETHOD.
METHOD decode3.
@ -1064,13 +1066,14 @@ CLASS ltcl_git_pack_decode_commit IMPLEMENTATION.
cl_abap_unit_assert=>assert_equals(
act = ms_raw-committer
exp = 'committer' ).
cl_abap_unit_assert=>assert_equals(
act = ms_raw-body
exp = 'comment' ).
cl_abap_unit_assert=>assert_equals(
act = ms_raw-parent
exp = 'parent1' ).
cl_abap_unit_assert=>assert_char_cp(
act = ms_raw-body
exp = 'comment+' ).
ENDMETHOD.
ENDCLASS.
@ -1084,11 +1087,15 @@ CLASS ltcl_git_pack DEFINITION FOR TESTING RISK LEVEL HARMLESS DURATION SHORT FI
PRIVATE SECTION.
CONSTANTS: c_sha TYPE lif_defs=>ty_sha1 VALUE '5f46cb3c4b7f0b3600b64f744cde614a283a88dc'.
METHODS:
tree FOR TESTING
RAISING lcx_exception,
commit FOR TESTING
RAISING lcx_exception,
commit_newline FOR TESTING
RAISING lcx_exception,
pack_short FOR TESTING
RAISING lcx_exception,
pack_long FOR TESTING
@ -1096,7 +1103,11 @@ CLASS ltcl_git_pack DEFINITION FOR TESTING RISK LEVEL HARMLESS DURATION SHORT FI
pack_multiple FOR TESTING
RAISING lcx_exception,
sort_tree1 FOR TESTING,
sort_tree2 FOR TESTING.
sort_tree2 FOR TESTING,
type_and_length01 FOR TESTING
RAISING lcx_exception,
type_and_length02 FOR TESTING
RAISING lcx_exception.
METHODS:
object_blob
@ -1113,6 +1124,34 @@ ENDCLASS. "test DEFINITION
*----------------------------------------------------------------------*
CLASS ltcl_git_pack IMPLEMENTATION.
METHOD type_and_length01.
DATA: lv_result TYPE xstring.
lv_result = lcl_git_pack=>type_and_length(
iv_type = lif_defs=>gc_type-commit
iv_length = 100 ).
cl_abap_unit_assert=>assert_equals(
act = lv_result
exp = '9406' ).
ENDMETHOD.
METHOD type_and_length02.
DATA: lv_result TYPE xstring.
lv_result = lcl_git_pack=>type_and_length(
iv_type = lif_defs=>gc_type-blob
iv_length = 90000 ).
cl_abap_unit_assert=>assert_equals(
act = lv_result
exp = 'B0F92B' ).
ENDMETHOD.
METHOD sort_tree1.
DATA: lt_tree TYPE lcl_git_pack=>ty_nodes_tt.
@ -1294,8 +1333,6 @@ CLASS ltcl_git_pack IMPLEMENTATION.
METHOD tree.
CONSTANTS: lc_sha TYPE lif_defs=>ty_sha1 VALUE '5f46cb3c4b7f0b3600b64f744cde614a283a88dc'.
DATA: lt_nodes TYPE lcl_git_pack=>ty_nodes_tt,
ls_node LIKE LINE OF lt_nodes,
lv_data TYPE xstring,
@ -1304,7 +1341,7 @@ CLASS ltcl_git_pack IMPLEMENTATION.
CLEAR ls_node.
ls_node-chmod = lif_defs=>gc_chmod-file.
ls_node-name = 'foobar.txt'.
ls_node-sha1 = lc_sha.
ls_node-sha1 = c_sha.
APPEND ls_node TO lt_nodes.
lv_data = lcl_git_pack=>encode_tree( lt_nodes ).
@ -1318,16 +1355,13 @@ CLASS ltcl_git_pack IMPLEMENTATION.
METHOD commit.
CONSTANTS: lc_tree TYPE lif_defs=>ty_sha1 VALUE '5f46cb3c4b7f0b3600b64f744cde614a283a88dc',
lc_parent TYPE lif_defs=>ty_sha1 VALUE '1236cb3c4b7f0b3600b64f744cde614a283a88dc'.
DATA: ls_commit TYPE lcl_git_pack=>ty_commit,
ls_result TYPE lcl_git_pack=>ty_commit,
lv_data TYPE xstring.
ls_commit-tree = lc_tree.
ls_commit-parent = lc_parent.
ls_commit-tree = c_sha.
ls_commit-parent = c_sha.
ls_commit-author = 'larshp <larshp@hotmail.com> 1387823471 +0100'.
ls_commit-committer = 'larshp <larshp@hotmail.com> 1387823471 +0100'.
ls_commit-body = 'very informative'.
@ -1341,6 +1375,28 @@ CLASS ltcl_git_pack IMPLEMENTATION.
ENDMETHOD. "commit
METHOD commit_newline.
DATA: ls_commit TYPE lcl_git_pack=>ty_commit,
ls_result TYPE lcl_git_pack=>ty_commit,
lv_data TYPE xstring.
ls_commit-tree = c_sha.
ls_commit-parent = c_sha.
ls_commit-author = 'larshp <larshp@hotmail.com> 1387823471 +0100'.
ls_commit-committer = 'larshp <larshp@hotmail.com> 1387823471 +0100'.
ls_commit-body = 'very informative' && lif_defs=>gc_newline && lif_defs=>gc_newline.
lv_data = lcl_git_pack=>encode_commit( ls_commit ).
ls_result = lcl_git_pack=>decode_commit( lv_data ).
cl_abap_unit_assert=>assert_equals(
exp = ls_commit
act = ls_result ).
ENDMETHOD.
ENDCLASS. "lcl_abap_unit IMPLEMENTATION
CLASS ltcl_html DEFINITION FOR TESTING RISK LEVEL HARMLESS DURATION SHORT FINAL.
@ -1742,13 +1798,59 @@ CLASS ltcl_html_action_utils DEFINITION FOR TESTING RISK LEVEL HARMLESS
PUBLIC SECTION.
CLASS-METHODS class_constructor.
METHODS add_field FOR TESTING.
METHODS get_field FOR TESTING.
METHODS parse_fields_simple_case FOR TESTING.
METHODS parse_fields_advanced_case FOR TESTING.
METHODS parse_fields_unescape FOR TESTING.
METHODS parse_fields_german_umlauts FOR TESTING.
PRIVATE SECTION.
CONSTANTS: BEGIN OF co_german_umlaut_as_hex,
lower_case_ae TYPE xstring VALUE 'C3A4',
lower_case_oe TYPE xstring VALUE 'C3B6',
lower_case_ue TYPE xstring VALUE 'C3BC',
END OF co_german_umlaut_as_hex.
CLASS-DATA: BEGIN OF ms_german_umlaut_as_char,
lower_case_ae TYPE string,
lower_case_oe TYPE string,
lower_case_ue TYPE string,
END OF ms_german_umlaut_as_char.
DATA m_given_parse_string TYPE string.
DATA mt_parsed_fields TYPE tihttpnvp.
METHODS _given_string_is
IMPORTING
i_string TYPE string.
METHODS _when_fields_are_parsed.
METHODS _then_fields_should_be
IMPORTING
index TYPE i
name TYPE string
value TYPE string.
CLASS-METHODS _hex_to_char
IMPORTING
i_x TYPE xstring
RETURNING
VALUE(r_s) TYPE string.
ENDCLASS. "ltcl_html_action_utils
CLASS ltcl_html_action_utils IMPLEMENTATION.
METHOD class_constructor.
ms_german_umlaut_as_char-lower_case_ae = _hex_to_char( co_german_umlaut_as_hex-lower_case_ae ).
ms_german_umlaut_as_char-lower_case_oe = _hex_to_char( co_german_umlaut_as_hex-lower_case_oe ).
ms_german_umlaut_as_char-lower_case_ue = _hex_to_char( co_german_umlaut_as_hex-lower_case_ue ).
ENDMETHOD.
METHOD add_field.
DATA: lt_fields TYPE tihttpnvp,
@ -1793,6 +1895,155 @@ CLASS ltcl_html_action_utils IMPLEMENTATION.
ENDMETHOD. "get_field
METHOD parse_fields_simple_case.
_given_string_is( `committer_name=Gustav Gans` ).
_when_fields_are_parsed( ).
_then_fields_should_be( index = 1 name = `COMMITTER_NAME` value = `Gustav Gans` ).
ENDMETHOD.
METHOD parse_fields_advanced_case.
_given_string_is( `committer_name=Albert Schweitzer&`
&& `committer_email=albert.schweitzer@googlemail.com&`
&& `comment=dummy comment&`
&& `body=Message body<<new>><<new>>with line break<<new>>&`
&& `author_name=Karl Klammer&`
&& `author_email=karl@klammer.com` ).
_when_fields_are_parsed( ).
_then_fields_should_be( index = 1
name = `COMMITTER_NAME`
value = `Albert Schweitzer` ).
_then_fields_should_be( index = 2
name = `COMMITTER_EMAIL`
value = `albert.schweitzer@googlemail.com` ).
_then_fields_should_be( index = 3
name = `COMMENT`
value = `dummy comment` ).
_then_fields_should_be( index = 4
name = `BODY`
value = `Message body<<new>><<new>>with line break<<new>>` ).
_then_fields_should_be( index = 5
name = `AUTHOR_NAME`
value = `Karl Klammer` ).
_then_fields_should_be( index = 6
name = `AUTHOR_EMAIL`
value = `karl@klammer.com` ).
ENDMETHOD.
METHOD parse_fields_unescape.
* file status = '?', used in staging page
_given_string_is( '/SRC/ZFOOBAR.PROG.ABAP=%3F' ).
_when_fields_are_parsed( ).
_then_fields_should_be( index = 1
name = '/SRC/ZFOOBAR.PROG.ABAP'
value = '?' ).
ENDMETHOD.
METHOD parse_fields_german_umlauts.
DATA: ae TYPE string,
oe TYPE string,
ue TYPE string,
ae_oe_ue TYPE string.
ae = ms_german_umlaut_as_char-lower_case_ae.
oe = ms_german_umlaut_as_char-lower_case_oe.
ue = ms_german_umlaut_as_char-lower_case_ue.
ae_oe_ue = ae && oe && ue.
_given_string_is( |committer_name=Christian G{ ue }nter&|
&& |committer_email=guenne@googlemail.com&|
&& |comment={ ae_oe_ue }&|
&& |body=Message body<<new>><<new>>with line break<<new>>and umlauts. { ae_oe_ue }&|
&& |author_name=Gerd Schr{ oe }der&|
&& |author_email=gerd@schroeder.com| ).
_when_fields_are_parsed( ).
_then_fields_should_be( index = 1
name = `COMMITTER_NAME`
value = |Christian G{ ue }nter| ).
_then_fields_should_be( index = 2
name = `COMMITTER_EMAIL`
value = `guenne@googlemail.com` ).
_then_fields_should_be( index = 3
name = `COMMENT`
value = ae_oe_ue ).
_then_fields_should_be( index = 4
name = `BODY`
value = |Message body<<new>><<new>>with line break<<new>>and umlauts. { ae_oe_ue }| ).
_then_fields_should_be( index = 5
name = `AUTHOR_NAME`
value = |Gerd Schr{ oe }der| ).
_then_fields_should_be( index = 6
name = `AUTHOR_EMAIL`
value = `gerd@schroeder.com` ).
ENDMETHOD.
METHOD _given_string_is.
m_given_parse_string = i_string.
ENDMETHOD.
METHOD _when_fields_are_parsed.
mt_parsed_fields = lcl_html_action_utils=>parse_fields_upper_case_name( m_given_parse_string ).
ENDMETHOD.
METHOD _then_fields_should_be.
FIELD-SYMBOLS: <parsed_field> LIKE LINE OF mt_parsed_fields.
READ TABLE mt_parsed_fields ASSIGNING <parsed_field>
INDEX index.
cl_abap_unit_assert=>assert_subrc( exp = 0
msg = |No parsed field found at index { index }| ).
cl_abap_unit_assert=>assert_equals( act = <parsed_field>-name
exp = name
msg = |Name at index { index } should be { name }| ).
cl_abap_unit_assert=>assert_equals( act = <parsed_field>-value
exp = value
msg = |Value at index { index } should be { value }| ).
ENDMETHOD.
METHOD _hex_to_char.
DATA lr_conv TYPE REF TO cl_abap_conv_in_ce.
lr_conv = cl_abap_conv_in_ce=>create( ).
lr_conv->convert( EXPORTING input = i_x IMPORTING data = r_s ).
ENDMETHOD.
ENDCLASS. "ltcl_html_action_utils
CLASS ltcl_path DEFINITION FOR TESTING RISK LEVEL HARMLESS DURATION SHORT FINAL
@ -1957,7 +2208,8 @@ CLASS ltcl_file_status DEFINITION FOR TESTING RISK LEVEL HARMLESS
INHERITING FROM cl_aunit_assert.
PUBLIC SECTION.
METHODS calculate_status FOR TESTING.
METHODS calculate_status FOR TESTING
RAISING lcx_exception.
ENDCLASS. "ltcl_file_status

View File

@ -133,9 +133,8 @@ CLASS lcl_convert DEFINITION FINAL.
RETURNING VALUE(rv_i) TYPE i
RAISING lcx_exception.
CLASS-METHODS int_to_xstring
CLASS-METHODS int_to_xstring4
IMPORTING iv_i TYPE i
iv_length TYPE i
RETURNING VALUE(rv_xstring) TYPE xstring.
CLASS-METHODS split_string
@ -151,13 +150,12 @@ ENDCLASS. "lcl_convert DEFINITION
*----------------------------------------------------------------------*
CLASS lcl_convert IMPLEMENTATION.
METHOD int_to_xstring.
METHOD int_to_xstring4.
* returns xstring of length 4 containing the integer value iv_i
DATA: lv_x TYPE x LENGTH 4.
ASSERT iv_length = 4. " other cases not implemented
lv_x = iv_i.
rv_xstring = lv_x.
@ -302,7 +300,8 @@ CLASS lcl_hash IMPLEMENTATION.
METHOD adler32.
CONSTANTS: lc_adler TYPE i VALUE 65521.
CONSTANTS: lc_adler TYPE i VALUE 65521,
lc_max_b TYPE i VALUE 1800000000.
DATA: lv_index TYPE i,
lv_a TYPE i VALUE 1,
@ -316,10 +315,22 @@ CLASS lcl_hash IMPLEMENTATION.
DO xstrlen( iv_xstring ) TIMES.
lv_index = sy-index - 1.
lv_a = ( lv_a + iv_xstring+lv_index(1) ) MOD lc_adler.
lv_b = ( lv_b + lv_a ) MOD lc_adler.
lv_a = lv_a + iv_xstring+lv_index(1).
lv_b = lv_b + lv_a.
* delay the MOD operation until the integer might overflow
* articles describe 5552 additions are allowed, but this assumes unsigned integers
* instead of allowing a fixed number of additions before running MOD, then
* just compare value of lv_b, this is 1 operation less than comparing and adding
IF lv_b > lc_max_b.
lv_a = lv_a MOD lc_adler.
lv_b = lv_b MOD lc_adler.
ENDIF.
ENDDO.
lv_a = lv_a MOD lc_adler.
lv_b = lv_b MOD lc_adler.
lv_x = lv_a.
lv_ca = lv_x.

View File

@ -2,83 +2,6 @@
*& Include ZABAPGIT_ZLIB
*&---------------------------------------------------------------------*
*----------------------------------------------------------------------*
* CLASS lcl_zlib_convert DEFINITION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS lcl_zlib_convert DEFINITION FINAL.
PUBLIC SECTION.
CLASS-METHODS:
hex_to_bits
IMPORTING iv_hex TYPE xsequence
RETURNING VALUE(rv_bits) TYPE string,
bits_to_int
IMPORTING iv_bits TYPE clike
RETURNING VALUE(rv_int) TYPE i,
int_to_hex
IMPORTING iv_int TYPE i
RETURNING VALUE(rv_hex) TYPE xstring.
ENDCLASS. "lcl_zlib_convert DEFINITION
*----------------------------------------------------------------------*
* CLASS lcl_zlib_convert IMPLEMENTATION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS lcl_zlib_convert IMPLEMENTATION.
METHOD hex_to_bits.
DATA: lv_x TYPE x LENGTH 1,
lv_c TYPE c LENGTH 1,
lv_bit TYPE i,
lv_hex TYPE xstring.
lv_hex = iv_hex.
WHILE NOT lv_hex IS INITIAL.
lv_x = lv_hex.
DO 8 TIMES.
lv_bit = sy-index.
GET BIT lv_bit OF lv_x INTO lv_c.
CONCATENATE rv_bits lv_c INTO rv_bits.
ENDDO.
lv_hex = lv_hex+1.
ENDWHILE.
ENDMETHOD. "hex_to_bits
METHOD bits_to_int.
DATA: lv_c TYPE c LENGTH 1,
lv_bits TYPE string.
lv_bits = iv_bits.
WHILE NOT lv_bits IS INITIAL.
lv_c = lv_bits.
rv_int = rv_int * 2.
rv_int = rv_int + lv_c.
lv_bits = lv_bits+1.
ENDWHILE.
ENDMETHOD. "bits_to_int
METHOD int_to_hex.
DATA: lv_x TYPE x.
lv_x = iv_int.
rv_hex = lv_x.
ENDMETHOD. "int_to_hex
ENDCLASS. "lcl_zlib_convert IMPLEMENTATION
*----------------------------------------------------------------------*
* CLASS lcl_zlib_stream DEFINITION
*----------------------------------------------------------------------*
@ -126,7 +49,7 @@ CLASS lcl_zlib_stream IMPLEMENTATION.
METHOD take_int.
rv_int = lcl_zlib_convert=>bits_to_int( take_bits( iv_length ) ).
rv_int = zcl_abapgit_zlib_convert=>bits_to_int( take_bits( iv_length ) ).
ENDMETHOD. "take_int
@ -140,7 +63,7 @@ CLASS lcl_zlib_stream IMPLEMENTATION.
WHILE strlen( rv_bits ) < iv_length.
IF mv_bits IS INITIAL.
lv_x = mv_compressed(1).
mv_bits = lcl_zlib_convert=>hex_to_bits( lv_x ).
mv_bits = zcl_abapgit_zlib_convert=>hex_to_bits( lv_x ).
mv_compressed = mv_compressed+1.
ENDIF.
lv_left = iv_length - strlen( rv_bits ).
@ -334,7 +257,7 @@ CLASS lcl_zlib IMPLEMENTATION.
lv_bit = go_stream->take_bits( 1 ).
CONCATENATE lv_bits lv_bit INTO lv_bits.
lv_code = lcl_zlib_convert=>bits_to_int( lv_bits ).
lv_code = zcl_abapgit_zlib_convert=>bits_to_int( lv_bits ).
lv_count = io_huffman->get_count( lv_len ).
IF lv_code - lv_count < lv_first.
@ -686,7 +609,7 @@ CLASS lcl_zlib IMPLEMENTATION.
lv_symbol = decode( go_lencode ).
IF lv_symbol < 256.
lv_x = lcl_zlib_convert=>int_to_hex( lv_symbol ).
lv_x = zcl_abapgit_zlib_convert=>int_to_hex( lv_symbol ).
CONCATENATE gv_out lv_x INTO gv_out IN BYTE MODE.
ELSEIF lv_symbol = 256.
EXIT.

View File

@ -0,0 +1,70 @@
CLASS zcl_abapgit_zlib_convert DEFINITION PUBLIC CREATE PUBLIC.
PUBLIC SECTION.
CLASS-METHODS:
hex_to_bits
IMPORTING iv_hex TYPE xsequence
RETURNING VALUE(rv_bits) TYPE string,
bits_to_int
IMPORTING iv_bits TYPE clike
RETURNING VALUE(rv_int) TYPE i,
int_to_hex
IMPORTING iv_int TYPE i
RETURNING VALUE(rv_hex) TYPE xstring.
ENDCLASS.
CLASS ZCL_ABAPGIT_ZLIB_CONVERT IMPLEMENTATION.
METHOD bits_to_int.
DATA: lv_c TYPE c LENGTH 1,
lv_bits TYPE string.
lv_bits = iv_bits.
WHILE NOT lv_bits IS INITIAL.
lv_c = lv_bits.
rv_int = rv_int * 2.
rv_int = rv_int + lv_c.
lv_bits = lv_bits+1.
ENDWHILE.
ENDMETHOD. "bits_to_int
METHOD hex_to_bits.
DATA: lv_x TYPE x LENGTH 1,
lv_c TYPE c LENGTH 1,
lv_bit TYPE i,
lv_hex TYPE xstring.
lv_hex = iv_hex.
WHILE NOT lv_hex IS INITIAL.
lv_x = lv_hex.
DO 8 TIMES.
lv_bit = sy-index.
GET BIT lv_bit OF lv_x INTO lv_c.
CONCATENATE rv_bits lv_c INTO rv_bits.
ENDDO.
lv_hex = lv_hex+1.
ENDWHILE.
ENDMETHOD. "hex_to_bits
METHOD int_to_hex.
DATA: lv_x TYPE x.
lv_x = iv_int.
rv_hex = lv_x.
ENDMETHOD. "int_to_hex
ENDCLASS.

View File

@ -0,0 +1,18 @@
<?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_ZLIB_CONVERT</CLSNAME>
<VERSION>1</VERSION>
<LANGU>E</LANGU>
<DESCRIPT>abapGit</DESCRIPT>
<EXPOSURE>2</EXPOSURE>
<STATE>1</STATE>
<CLSCCINCL>X</CLSCCINCL>
<FIXPT>X</FIXPT>
<UNICODE>X</UNICODE>
</VSEOCLASS>
</asx:values>
</asx:abap>
</abapGit>