-
-
Notifications
You must be signed in to change notification settings - Fork 534
/
zcl_abapgit_object_clas.clas.abap
1124 lines (834 loc) · 33.7 KB
/
zcl_abapgit_object_clas.clas.abap
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
CLASS zcl_abapgit_object_clas DEFINITION
PUBLIC
INHERITING FROM zcl_abapgit_objects_program
CREATE PUBLIC .
PUBLIC SECTION.
INTERFACES zif_abapgit_object .
METHODS constructor
IMPORTING
!is_item TYPE zif_abapgit_definitions=>ty_item
!iv_language TYPE spras
!io_files TYPE REF TO zcl_abapgit_objects_files OPTIONAL
!io_i18n_params TYPE REF TO zcl_abapgit_i18n_params OPTIONAL
RAISING
zcx_abapgit_exception.
PROTECTED SECTION.
DATA: mi_object_oriented_object_fct TYPE REF TO zif_abapgit_oo_object_fnc,
mv_skip_testclass TYPE abap_bool,
mv_classpool_name TYPE progname.
METHODS:
deserialize_abap
IMPORTING ii_xml TYPE REF TO zif_abapgit_xml_input
iv_package TYPE devclass
RAISING zcx_abapgit_exception,
deserialize_descr
IMPORTING ii_xml TYPE REF TO zif_abapgit_xml_input
RAISING zcx_abapgit_exception,
deserialize_docu
IMPORTING ii_xml TYPE REF TO zif_abapgit_xml_input
RAISING zcx_abapgit_exception,
deserialize_tpool
IMPORTING ii_xml TYPE REF TO zif_abapgit_xml_input
RAISING zcx_abapgit_exception,
deserialize_tpool_i18n
IMPORTING ii_xml TYPE REF TO zif_abapgit_xml_input
RAISING zcx_abapgit_exception,
deserialize_sotr
IMPORTING ii_xml TYPE REF TO zif_abapgit_xml_input
iv_package TYPE devclass
RAISING zcx_abapgit_exception,
deserialize_exceptions
IMPORTING ii_xml TYPE REF TO zif_abapgit_xml_input
RAISING zcx_abapgit_exception,
serialize_xml
IMPORTING ii_xml TYPE REF TO zif_abapgit_xml_output
RAISING zcx_abapgit_exception,
serialize_attr
IMPORTING
!ii_xml TYPE REF TO zif_abapgit_xml_output
!iv_clsname TYPE seoclsname
RAISING
zcx_abapgit_exception,
serialize_descr_class
IMPORTING
!ii_xml TYPE REF TO zif_abapgit_xml_output
!iv_clsname TYPE seoclsname
RAISING
zcx_abapgit_exception,
serialize_descr_compo
IMPORTING
!ii_xml TYPE REF TO zif_abapgit_xml_output
!iv_clsname TYPE seoclsname
RAISING
zcx_abapgit_exception,
serialize_descr_subco
IMPORTING
!ii_xml TYPE REF TO zif_abapgit_xml_output
!iv_clsname TYPE seoclsname
RAISING
zcx_abapgit_exception,
serialize_docu
IMPORTING
!ii_xml TYPE REF TO zif_abapgit_xml_output
!it_langu_additional TYPE zif_abapgit_lang_definitions=>ty_langus OPTIONAL
!iv_clsname TYPE seoclsname
RAISING
zcx_abapgit_exception,
serialize_tpool
IMPORTING
!ii_xml TYPE REF TO zif_abapgit_xml_output
!iv_clsname TYPE seoclsname
RETURNING
VALUE(rt_tpool) TYPE textpool_table
RAISING
zcx_abapgit_exception,
serialize_tpool_i18n
IMPORTING
!ii_xml TYPE REF TO zif_abapgit_xml_output
!it_langu_additional TYPE zif_abapgit_lang_definitions=>ty_langus OPTIONAL
!iv_clsname TYPE seoclsname
!it_tpool_main TYPE textpool_table
RAISING
zcx_abapgit_exception,
serialize_sotr
IMPORTING
!ii_xml TYPE REF TO zif_abapgit_xml_output
RAISING
zcx_abapgit_exception,
source_apack_replacement
CHANGING
!ct_source TYPE seop_source_string
RAISING
zcx_abapgit_exception,
repo_apack_replacement
CHANGING
!ct_source TYPE seop_source_string
RAISING
zcx_abapgit_exception.
PRIVATE SECTION.
CONSTANTS:
BEGIN OF c_longtext_name,
attributes TYPE string VALUE 'LONGTEXTS_CA',
methods TYPE string VALUE 'LONGTEXTS_CO',
events TYPE string VALUE 'LONGTEXTS_CE',
types TYPE string VALUE 'LONGTEXTS_CT',
END OF c_longtext_name.
CONSTANTS:
BEGIN OF c_longtext_id,
class TYPE dokil-id VALUE 'CL',
attributes TYPE dokil-id VALUE 'CA',
methods TYPE dokil-id VALUE 'CO',
events TYPE dokil-id VALUE 'CE',
types TYPE dokil-id VALUE 'CT',
END OF c_longtext_id.
METHODS deserialize_pre_ddic
IMPORTING
!ii_xml TYPE REF TO zif_abapgit_xml_input
!iv_package TYPE devclass
RAISING
zcx_abapgit_exception.
METHODS is_class_locked
RETURNING
VALUE(rv_is_class_locked) TYPE abap_bool
RAISING
zcx_abapgit_exception.
METHODS interface_replacement
IMPORTING
!iv_from_interface TYPE seoclsname
!iv_to_interface TYPE seoclsname
CHANGING
!ct_source TYPE seop_source_string.
ENDCLASS.
CLASS zcl_abapgit_object_clas IMPLEMENTATION.
METHOD constructor.
super->constructor(
is_item = is_item
iv_language = iv_language
io_files = io_files
io_i18n_params = io_i18n_params ).
mi_object_oriented_object_fct = zcl_abapgit_oo_factory=>get_by_type( ms_item-obj_type ).
mv_classpool_name = cl_oo_classname_service=>get_classpool_name( |{ is_item-obj_name }| ).
ENDMETHOD.
METHOD deserialize_abap.
DATA: ls_vseoclass TYPE vseoclass,
lt_source TYPE seop_source_string,
lt_local_definitions TYPE seop_source_string,
lt_local_implementations TYPE seop_source_string,
lt_local_macros TYPE seop_source_string,
lt_test_classes TYPE seop_source_string,
ls_class_key TYPE seoclskey,
lt_attributes TYPE zif_abapgit_oo_object_fnc=>ty_obj_attribute_tt.
lt_source = mo_files->read_abap( ).
lt_local_definitions = mo_files->read_abap(
iv_extra = zif_abapgit_oo_object_fnc=>c_parts-locals_def
iv_error = abap_false ).
lt_local_implementations = mo_files->read_abap(
iv_extra = zif_abapgit_oo_object_fnc=>c_parts-locals_imp
iv_error = abap_false ).
lt_local_macros = mo_files->read_abap(
iv_extra = zif_abapgit_oo_object_fnc=>c_parts-macros
iv_error = abap_false ).
lt_test_classes = mo_files->read_abap(
iv_extra = zif_abapgit_oo_object_fnc=>c_parts-testclasses
iv_error = abap_false ).
ls_class_key-clsname = ms_item-obj_name.
ii_xml->read( EXPORTING iv_name = 'VSEOCLASS'
CHANGING cg_data = ls_vseoclass ).
set_abap_language_version( CHANGING cv_abap_language_version = ls_vseoclass-unicode ).
ii_xml->read( EXPORTING iv_name = 'ATTRIBUTES'
CHANGING cg_data = lt_attributes ).
" Remove code for test classes if they have been deleted
IF ls_vseoclass-with_unit_tests = abap_false.
CLEAR lt_test_classes.
ENDIF.
mi_object_oriented_object_fct->create(
EXPORTING
iv_check = abap_true
iv_package = iv_package
it_attributes = lt_attributes
CHANGING
cg_properties = ls_vseoclass ).
mi_object_oriented_object_fct->generate_locals(
is_key = ls_class_key
iv_package = iv_package
iv_version = ls_vseoclass-unicode
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 ).
repo_apack_replacement( CHANGING ct_source = lt_source ).
mi_object_oriented_object_fct->deserialize_source(
is_key = ls_class_key
iv_package = iv_package
iv_version = ls_vseoclass-unicode
it_source = lt_source ).
ENDMETHOD.
METHOD deserialize_descr.
DATA:
ls_class_key TYPE seoclskey,
lt_descriptions_class TYPE zif_abapgit_oo_object_fnc=>ty_seoclasstx_tt,
lt_descriptions_compo TYPE zif_abapgit_oo_object_fnc=>ty_seocompotx_tt,
lt_descriptions_subco TYPE zif_abapgit_oo_object_fnc=>ty_seosubcotx_tt.
ls_class_key-clsname = ms_item-obj_name.
ii_xml->read( EXPORTING iv_name = 'DESCRIPTIONS_CLASS'
CHANGING cg_data = lt_descriptions_class ).
mi_object_oriented_object_fct->update_descriptions_class(
is_key = ls_class_key
iv_language = mv_language
it_descriptions = lt_descriptions_class ).
ii_xml->read( EXPORTING iv_name = 'DESCRIPTIONS'
CHANGING cg_data = lt_descriptions_compo ).
mi_object_oriented_object_fct->update_descriptions_compo(
is_key = ls_class_key
it_descriptions = lt_descriptions_compo ).
ii_xml->read( EXPORTING iv_name = 'DESCRIPTIONS_SUB'
CHANGING cg_data = lt_descriptions_subco ).
mi_object_oriented_object_fct->update_descriptions_subco(
is_key = ls_class_key
it_descriptions = lt_descriptions_subco ).
ENDMETHOD.
METHOD deserialize_docu.
DATA: lt_lines TYPE tlinetab,
lv_object TYPE dokhl-object,
lt_i18n_lines TYPE zif_abapgit_lang_definitions=>ty_i18n_lines,
ls_i18n_lines TYPE zif_abapgit_lang_definitions=>ty_i18n_line.
ii_xml->read( EXPORTING iv_name = 'LINES'
CHANGING cg_data = lt_lines ).
lv_object = ms_item-obj_name.
IF lines( lt_lines ) = 0.
mi_object_oriented_object_fct->delete_documentation(
iv_id = c_longtext_id-class
iv_object_name = lv_object
iv_language = mv_language ).
RETURN.
ENDIF.
mi_object_oriented_object_fct->create_documentation(
it_lines = lt_lines
iv_id = c_longtext_id-class
iv_object_name = lv_object
iv_language = mv_language ).
ii_xml->read( EXPORTING iv_name = 'I18N_LINES'
CHANGING cg_data = lt_i18n_lines ).
LOOP AT lt_i18n_lines INTO ls_i18n_lines.
mi_object_oriented_object_fct->create_documentation(
it_lines = ls_i18n_lines-lines
iv_id = c_longtext_id-class
iv_object_name = lv_object
iv_language = ls_i18n_lines-language
iv_no_masterlang = abap_true ).
ENDLOOP.
deserialize_longtexts(
ii_xml = ii_xml
iv_longtext_name = c_longtext_name-attributes
iv_longtext_id = c_longtext_id-attributes ).
deserialize_longtexts(
ii_xml = ii_xml
iv_longtext_name = c_longtext_name-methods
iv_longtext_id = c_longtext_id-methods ).
deserialize_longtexts(
ii_xml = ii_xml
iv_longtext_name = c_longtext_name-events
iv_longtext_id = c_longtext_id-events ).
deserialize_longtexts(
ii_xml = ii_xml
iv_longtext_name = c_longtext_name-types
iv_longtext_id = c_longtext_id-types ).
ENDMETHOD.
METHOD deserialize_exceptions.
DATA: ls_vseoclass TYPE vseoclass.
ii_xml->read( EXPORTING iv_name = 'VSEOCLASS'
CHANGING cg_data = ls_vseoclass ).
" For exceptions that are sub-class of another exception, we need to set the category explicitly (#6490)
IF ls_vseoclass-category = '40'.
UPDATE seoclassdf SET category = '40' WHERE clsname = ls_vseoclass-clsname.
ENDIF.
ENDMETHOD.
METHOD deserialize_pre_ddic.
DATA: ls_vseoclass TYPE vseoclass.
ii_xml->read( EXPORTING iv_name = 'VSEOCLASS'
CHANGING cg_data = ls_vseoclass ).
set_abap_language_version( CHANGING cv_abap_language_version = ls_vseoclass-unicode ).
IF ls_vseoclass-category = '40'.
" In lower releases, creating exception classes raise a popup asking for package
" To avoid this, we set the default package here
set_default_package( iv_package ).
ENDIF.
mi_object_oriented_object_fct->create(
EXPORTING
iv_check = abap_false
iv_package = iv_package
CHANGING
cg_properties = ls_vseoclass ).
ENDMETHOD.
METHOD deserialize_sotr.
"OTR stands for Online Text Repository
mi_object_oriented_object_fct->create_sotr(
iv_object_name = ms_item-obj_name
iv_package = iv_package
ii_xml = ii_xml ).
ENDMETHOD.
METHOD deserialize_tpool.
DATA: lv_clsname TYPE seoclsname,
lt_tpool_ext TYPE zif_abapgit_definitions=>ty_tpool_tt,
lt_tpool TYPE textpool_table.
ii_xml->read( EXPORTING iv_name = 'TPOOL'
CHANGING cg_data = lt_tpool_ext ).
lt_tpool = read_tpool( lt_tpool_ext ).
IF lines( lt_tpool ) = 0.
RETURN.
ENDIF.
lv_clsname = ms_item-obj_name.
mi_object_oriented_object_fct->insert_text_pool(
iv_class_name = lv_clsname
it_text_pool = lt_tpool
iv_language = mv_language ).
ENDMETHOD.
METHOD deserialize_tpool_i18n.
DATA: lv_clsname TYPE seoclsname,
lt_tpool TYPE textpool_table,
lt_i18n_tpool TYPE zif_abapgit_lang_definitions=>ty_i18n_tpools,
ls_i18n_tpool TYPE zif_abapgit_lang_definitions=>ty_i18n_tpool.
lv_clsname = ms_item-obj_name.
ii_xml->read( EXPORTING iv_name = 'I18N_TPOOL'
CHANGING cg_data = lt_i18n_tpool ).
mo_i18n_params->trim_saplang_keyed_table(
EXPORTING
iv_lang_field_name = 'LANGUAGE'
CHANGING
ct_tab = lt_i18n_tpool ).
LOOP AT lt_i18n_tpool INTO ls_i18n_tpool.
lt_tpool = read_tpool( ls_i18n_tpool-textpool ).
mi_object_oriented_object_fct->insert_text_pool(
iv_class_name = lv_clsname
it_text_pool = lt_tpool
iv_language = ls_i18n_tpool-language
iv_state = 'A' ).
ENDLOOP.
ENDMETHOD.
METHOD interface_replacement.
DATA lv_tabix TYPE sy-tabix.
FIELD-SYMBOLS <lv_source> LIKE LINE OF ct_source.
FIND REGEX '^\s*INTERFACES(:| )\s*' && iv_from_interface && '\s*.' IN TABLE ct_source MATCH LINE lv_tabix.
IF sy-subrc = 0.
READ TABLE ct_source ASSIGNING <lv_source> INDEX lv_tabix.
ASSERT sy-subrc = 0.
REPLACE FIRST OCCURRENCE OF iv_from_interface IN <lv_source>
WITH iv_to_interface IGNORING CASE.
REPLACE ALL OCCURRENCES OF iv_from_interface && '~descriptor' IN TABLE ct_source
WITH iv_to_interface && '~descriptor' IGNORING CASE.
REPLACE ALL OCCURRENCES OF iv_from_interface && '=>' IN TABLE ct_source
WITH iv_to_interface && '=>' IGNORING CASE.
REPLACE ALL OCCURRENCES OF iv_from_interface && '->' IN TABLE ct_source
WITH iv_to_interface && '->' IGNORING CASE.
ENDIF.
ENDMETHOD.
METHOD is_class_locked.
DATA: lv_argument TYPE seqg3-garg.
lv_argument = ms_item-obj_name.
OVERLAY lv_argument WITH '=============================='.
lv_argument = lv_argument && '*'.
rv_is_class_locked = exists_a_lock_entry_for( iv_lock_object = 'ESEOCLASS'
iv_argument = lv_argument ).
ENDMETHOD.
METHOD repo_apack_replacement.
DATA lv_apack TYPE seoclsname.
" Check if SAP-version of APACK manifest exists
SELECT SINGLE clsname INTO lv_apack
FROM seoclass
WHERE clsname = zif_abapgit_apack_definitions=>c_apack_interface_sap.
IF sy-subrc = 0.
RETURN.
ENDIF.
" If not, replace with abapGit version
interface_replacement(
EXPORTING
iv_from_interface = to_lower( zif_abapgit_apack_definitions=>c_apack_interface_sap )
iv_to_interface = to_lower( zif_abapgit_apack_definitions=>c_apack_interface_cust )
CHANGING
ct_source = ct_source ).
ENDMETHOD.
METHOD serialize_attr.
DATA: lt_attributes TYPE zif_abapgit_oo_object_fnc=>ty_obj_attribute_tt.
lt_attributes = mi_object_oriented_object_fct->read_attributes( iv_clsname ).
IF lines( lt_attributes ) = 0.
RETURN.
ENDIF.
ii_xml->add( iv_name = 'ATTRIBUTES'
ig_data = lt_attributes ).
ENDMETHOD.
METHOD serialize_descr_class.
DATA: lt_descriptions TYPE zif_abapgit_oo_object_fnc=>ty_seoclasstx_tt,
lt_language_filter TYPE zif_abapgit_environment=>ty_system_language_filter.
" Main language is already in VSEOCLASS so we serialize only translations
IF mo_i18n_params->ms_params-main_language_only = abap_true.
RETURN.
ENDIF.
lt_descriptions = mi_object_oriented_object_fct->read_descriptions_class(
iv_object_name = iv_clsname
iv_language = mv_language ).
IF lines( lt_descriptions ) = 0.
RETURN.
ENDIF.
" Remove technical languages
lt_language_filter = mo_i18n_params->build_language_filter( ).
DELETE lt_descriptions WHERE NOT langu IN lt_language_filter AND langu <> mv_language.
ii_xml->add( iv_name = 'DESCRIPTIONS_CLASS'
ig_data = lt_descriptions ).
ENDMETHOD.
METHOD serialize_descr_compo.
DATA: lt_descriptions TYPE zif_abapgit_oo_object_fnc=>ty_seocompotx_tt,
lv_language TYPE spras,
lt_language_filter TYPE zif_abapgit_environment=>ty_system_language_filter.
IF mo_i18n_params->ms_params-main_language_only = abap_true.
lv_language = mv_language.
ENDIF.
lt_descriptions = mi_object_oriented_object_fct->read_descriptions_compo(
iv_object_name = iv_clsname
iv_language = lv_language ).
IF lines( lt_descriptions ) = 0.
RETURN.
ENDIF.
" Remove technical languages
lt_language_filter = mo_i18n_params->build_language_filter( ).
DELETE lt_descriptions WHERE NOT langu IN lt_language_filter AND langu <> mv_language.
ii_xml->add( iv_name = 'DESCRIPTIONS'
ig_data = lt_descriptions ).
ENDMETHOD.
METHOD serialize_descr_subco.
DATA: lt_descriptions TYPE zif_abapgit_oo_object_fnc=>ty_seosubcotx_tt,
lv_language TYPE spras,
lt_language_filter TYPE zif_abapgit_environment=>ty_system_language_filter.
IF mo_i18n_params->ms_params-main_language_only = abap_true.
lv_language = mv_language.
ENDIF.
lt_descriptions = mi_object_oriented_object_fct->read_descriptions_subco(
iv_object_name = iv_clsname
iv_language = lv_language ).
IF lines( lt_descriptions ) = 0.
RETURN.
ENDIF.
" Remove technical languages
lt_language_filter = mo_i18n_params->build_language_filter( ).
DELETE lt_descriptions WHERE NOT langu IN lt_language_filter AND langu <> mv_language.
ii_xml->add( iv_name = 'DESCRIPTIONS_SUB'
ig_data = lt_descriptions ).
ENDMETHOD.
METHOD serialize_docu.
DATA: lt_lines TYPE tlinetab,
lv_object TYPE dokhl-object,
lv_langu TYPE sy-langu,
lt_i18n_lines TYPE zif_abapgit_lang_definitions=>ty_i18n_lines,
ls_i18n_lines TYPE zif_abapgit_lang_definitions=>ty_i18n_line.
lv_object = iv_clsname.
lt_lines = mi_object_oriented_object_fct->read_documentation(
iv_id = c_longtext_id-class
iv_object_name = lv_object
iv_language = mv_language ).
IF lines( lt_lines ) > 0.
ii_xml->add( iv_name = 'LINES'
ig_data = lt_lines ).
ENDIF.
IF mo_i18n_params->ms_params-main_language_only = abap_true.
RETURN.
ENDIF.
LOOP AT it_langu_additional INTO lv_langu.
lt_lines = mi_object_oriented_object_fct->read_documentation(
iv_id = c_longtext_id-class
iv_object_name = lv_object
iv_language = lv_langu ).
IF lines( lt_lines ) > 0.
CLEAR ls_i18n_lines.
ls_i18n_lines-language = lv_langu.
ls_i18n_lines-lines = lt_lines.
INSERT ls_i18n_lines INTO TABLE lt_i18n_lines.
ENDIF.
ENDLOOP.
IF lines( lt_i18n_lines ) > 0.
ii_xml->add( iv_name = 'I18N_LINES'
ig_data = lt_i18n_lines ).
ENDIF.
serialize_longtexts(
ii_xml = ii_xml
iv_longtext_name = c_longtext_name-attributes
iv_longtext_id = c_longtext_id-attributes ).
serialize_longtexts(
ii_xml = ii_xml
iv_longtext_name = c_longtext_name-methods
iv_longtext_id = c_longtext_id-methods ).
serialize_longtexts(
ii_xml = ii_xml
iv_longtext_name = c_longtext_name-events
iv_longtext_id = c_longtext_id-events ).
serialize_longtexts(
ii_xml = ii_xml
iv_longtext_name = c_longtext_name-types
iv_longtext_id = c_longtext_id-types ).
ENDMETHOD.
METHOD serialize_sotr.
mi_object_oriented_object_fct->read_sotr(
iv_object_name = ms_item-obj_name
io_i18n_params = mo_i18n_params
ii_xml = ii_xml ).
ENDMETHOD.
METHOD serialize_tpool.
DATA lt_tpool TYPE textpool_table.
lt_tpool = mi_object_oriented_object_fct->read_text_pool(
iv_class_name = iv_clsname
iv_language = mv_language ).
ii_xml->add( iv_name = 'TPOOL'
ig_data = add_tpool( lt_tpool ) ).
rt_tpool = lt_tpool.
ENDMETHOD.
METHOD serialize_tpool_i18n.
DATA: lt_tpool TYPE textpool_table,
lv_index TYPE i,
lv_langu TYPE sy-langu,
lt_i18n_tpool TYPE zif_abapgit_lang_definitions=>ty_i18n_tpools,
ls_i18n_tpool TYPE zif_abapgit_lang_definitions=>ty_i18n_tpool.
FIELD-SYMBOLS <ls_tpool> LIKE LINE OF it_tpool_main.
DATA lt_tpool_main LIKE SORTED TABLE OF <ls_tpool> WITH UNIQUE KEY id key.
IF mo_i18n_params->ms_params-main_language_only = abap_true OR lines( it_tpool_main ) = 0.
RETURN.
ENDIF.
" Copy single records to be able to catch duplicate key error
LOOP AT it_tpool_main ASSIGNING <ls_tpool>.
INSERT <ls_tpool> INTO TABLE lt_tpool_main.
IF sy-subrc <> 0.
zcx_abapgit_exception=>raise( |Inconsistent textpool in { ms_item-obj_type } { ms_item-obj_name }| ).
ENDIF.
ENDLOOP.
LOOP AT it_langu_additional INTO lv_langu.
lt_tpool = mi_object_oriented_object_fct->read_text_pool(
iv_class_name = iv_clsname
iv_language = lv_langu ).
LOOP AT lt_tpool ASSIGNING <ls_tpool>.
lv_index = sy-tabix.
READ TABLE lt_tpool_main WITH KEY id = <ls_tpool>-id key = <ls_tpool>-key
TRANSPORTING NO FIELDS.
IF sy-subrc <> 0.
DELETE lt_tpool INDEX lv_index.
ENDIF.
ENDLOOP.
IF lines( lt_tpool ) > 0.
CLEAR ls_i18n_tpool.
ls_i18n_tpool-language = lv_langu.
ls_i18n_tpool-textpool = add_tpool( lt_tpool ).
INSERT ls_i18n_tpool INTO TABLE lt_i18n_tpool.
ENDIF.
ENDLOOP.
IF lines( lt_i18n_tpool ) > 0.
ii_xml->add( iv_name = 'I18N_TPOOL'
ig_data = lt_i18n_tpool ).
ENDIF.
ENDMETHOD.
METHOD serialize_xml.
DATA: ls_vseoclass TYPE vseoclass,
lt_tpool TYPE textpool_table,
ls_clskey TYPE seoclskey,
lt_langu_additional TYPE zif_abapgit_lang_definitions=>ty_langus,
lt_language_filter TYPE zif_abapgit_environment=>ty_system_language_filter.
ls_clskey-clsname = ms_item-obj_name.
"If class was deserialized with a previous version of abapGit and current language was different
"from main language at this time, this call would return SY-LANGU as main language. To fix
"these objects, set SY-LANGU to main language temporarily.
zcl_abapgit_language=>set_current_language( mv_language ).
TRY.
ls_vseoclass = mi_object_oriented_object_fct->get_class_properties( ls_clskey ).
clear_abap_language_version( CHANGING cv_abap_language_version = ls_vseoclass-unicode ).
CLEANUP.
zcl_abapgit_language=>restore_login_language( ).
ENDTRY.
zcl_abapgit_language=>restore_login_language( ).
IF mv_skip_testclass = abap_true.
CLEAR ls_vseoclass-with_unit_tests.
ENDIF.
" Table d010tinf stores info. on languages in which program is maintained
" Select all active translations of program texts
" Skip main language - it was already serialized
lt_language_filter = mo_i18n_params->build_language_filter( ).
SELECT DISTINCT language
INTO TABLE lt_langu_additional
FROM d010tinf
WHERE r3state = 'A'
AND prog = mv_classpool_name
AND language IN lt_language_filter
AND language <> mv_language
ORDER BY language.
ii_xml->add( iv_name = 'VSEOCLASS'
ig_data = ls_vseoclass ).
lt_tpool = serialize_tpool(
ii_xml = ii_xml
iv_clsname = ls_clskey-clsname ).
IF mo_i18n_params->is_lxe_applicable( ) = abap_false.
serialize_tpool_i18n(
ii_xml = ii_xml
it_langu_additional = lt_langu_additional
it_tpool_main = lt_tpool
iv_clsname = ls_clskey-clsname ).
ENDIF.
IF ls_vseoclass-category = seoc_category_exception.
serialize_sotr( ii_xml ).
ENDIF.
SELECT DISTINCT langu
INTO TABLE lt_langu_additional
FROM dokhl
WHERE id = 'CL'
AND object = ls_clskey-clsname
AND langu IN lt_language_filter
AND langu <> mv_language
ORDER BY langu.
serialize_docu( ii_xml = ii_xml
iv_clsname = ls_clskey-clsname
it_langu_additional = lt_langu_additional ).
serialize_descr_class( ii_xml = ii_xml
iv_clsname = ls_clskey-clsname ).
serialize_descr_compo( ii_xml = ii_xml
iv_clsname = ls_clskey-clsname ).
serialize_descr_subco( ii_xml = ii_xml
iv_clsname = ls_clskey-clsname ).
serialize_attr( ii_xml = ii_xml
iv_clsname = ls_clskey-clsname ).
ENDMETHOD.
METHOD source_apack_replacement.
DATA lv_clsname TYPE seoclsname.
" Check if abapGit version of APACK manifest is used
SELECT SINGLE clsname INTO lv_clsname
FROM seometarel
WHERE clsname = ms_item-obj_name
AND refclsname = zif_abapgit_apack_definitions=>c_apack_interface_cust
AND version = '1'.
IF sy-subrc <> 0.
RETURN.
ENDIF.
" If yes, replace with SAP-version
interface_replacement(
EXPORTING
iv_from_interface = to_lower( zif_abapgit_apack_definitions=>c_apack_interface_cust )
iv_to_interface = to_lower( zif_abapgit_apack_definitions=>c_apack_interface_sap )
CHANGING
ct_source = ct_source ).
ENDMETHOD.
METHOD zif_abapgit_object~changed_by.
TYPES: BEGIN OF ty_reposrc,
unam TYPE reposrc-unam,
udat TYPE reposrc-udat,
utime TYPE reposrc-utime,
END OF ty_reposrc.
DATA: lt_reposrc TYPE STANDARD TABLE OF ty_reposrc,
ls_reposrc LIKE LINE OF lt_reposrc,
lv_include TYPE syrepid,
lt_includes TYPE STANDARD TABLE OF syrepid.
CASE iv_extra.
WHEN zif_abapgit_oo_object_fnc=>c_parts-locals_def.
lv_include = cl_oo_classname_service=>get_ccdef_name( |{ ms_item-obj_name }| ).
INSERT lv_include INTO TABLE lt_includes.
WHEN zif_abapgit_oo_object_fnc=>c_parts-locals_imp.
lv_include = cl_oo_classname_service=>get_ccimp_name( |{ ms_item-obj_name }| ).
INSERT lv_include INTO TABLE lt_includes.
WHEN zif_abapgit_oo_object_fnc=>c_parts-macros.
lv_include = cl_oo_classname_service=>get_ccmac_name( |{ ms_item-obj_name }| ).
INSERT lv_include INTO TABLE lt_includes.
WHEN zif_abapgit_oo_object_fnc=>c_parts-testclasses.
lv_include = cl_oo_classname_service=>get_ccau_name( |{ ms_item-obj_name }| ).
INSERT lv_include INTO TABLE lt_includes.
WHEN OTHERS.
lt_includes = mi_object_oriented_object_fct->get_includes( ms_item-obj_name ).
ENDCASE.
ASSERT lines( lt_includes ) > 0.
SELECT unam udat utime FROM reposrc
INTO TABLE lt_reposrc
FOR ALL ENTRIES IN lt_includes
WHERE progname = lt_includes-table_line
AND r3state = 'A'.
IF sy-subrc <> 0.
rv_user = c_user_unknown.
ELSE.
SORT lt_reposrc BY udat DESCENDING utime DESCENDING.
READ TABLE lt_reposrc INDEX 1 INTO ls_reposrc.
ASSERT sy-subrc = 0.
rv_user = ls_reposrc-unam.
ENDIF.
ENDMETHOD.
METHOD zif_abapgit_object~delete.
DATA: ls_clskey TYPE seoclskey.
ls_clskey-clsname = ms_item-obj_name.
corr_insert( iv_package ).
mi_object_oriented_object_fct->delete( ls_clskey ).
ENDMETHOD.
METHOD zif_abapgit_object~deserialize.
IF iv_step = zif_abapgit_object=>gc_step_id-abap.
deserialize_abap( ii_xml = io_xml
iv_package = iv_package ).
deserialize_descr( io_xml ).
deserialize_tpool( io_xml ).
IF mo_i18n_params->is_lxe_applicable( ) = abap_false.
deserialize_tpool_i18n( io_xml ).
ENDIF.
deserialize_sotr( ii_xml = io_xml
iv_package = iv_package ).
deserialize_docu( io_xml ).
mi_object_oriented_object_fct->add_to_activation_list( ms_item ).
ELSEIF iv_step = zif_abapgit_object=>gc_step_id-early.
" If class does not exist, create it
" so DDIC that depends on it does not fail activation
IF zif_abapgit_object~exists( ) = abap_false.
deserialize_pre_ddic(
ii_xml = io_xml
iv_package = iv_package ).
ELSE.
corr_insert( iv_package ).
ENDIF.
ELSEIF iv_step = zif_abapgit_object=>gc_step_id-late.
deserialize_exceptions( io_xml ).
ENDIF.
ENDMETHOD.
METHOD zif_abapgit_object~exists.
DATA ls_class_key TYPE seoclskey.
ls_class_key-clsname = ms_item-obj_name.
rv_bool = mi_object_oriented_object_fct->exists( ls_class_key ).
" Skip classes generated by DDLS (SADL)
IF rv_bool = abap_true AND
mi_object_oriented_object_fct->read_superclass( ls_class_key-clsname ) = 'CL_SADL_GTK_EXPOSURE_MPC'.
rv_bool = abap_false.
ENDIF.
ENDMETHOD.
METHOD zif_abapgit_object~get_comparator.
RETURN.
ENDMETHOD.
METHOD zif_abapgit_object~get_deserialize_order.
RETURN.
ENDMETHOD.
METHOD zif_abapgit_object~get_deserialize_steps.
APPEND zif_abapgit_object=>gc_step_id-early TO rt_steps.
APPEND zif_abapgit_object=>gc_step_id-abap TO rt_steps.
APPEND zif_abapgit_object=>gc_step_id-late TO rt_steps.
ENDMETHOD.