@open-rap/compiler 0.0.0-stage → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (227) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +21 -2
  3. package/dist/agent/server.d.ts +35 -0
  4. package/dist/agent/server.js +408 -0
  5. package/dist/agent/server.js.map +1 -0
  6. package/dist/authoring/abapgit.d.ts +38 -0
  7. package/dist/authoring/abapgit.js +242 -0
  8. package/dist/authoring/abapgit.js.map +1 -0
  9. package/dist/authoring/catalog.d.ts +48 -0
  10. package/dist/authoring/catalog.js +117 -0
  11. package/dist/authoring/catalog.js.map +1 -0
  12. package/dist/authoring/floorplan.d.ts +28 -0
  13. package/dist/authoring/floorplan.js +31 -0
  14. package/dist/authoring/floorplan.js.map +1 -0
  15. package/dist/authoring/generate.d.ts +57 -0
  16. package/dist/authoring/generate.js +630 -0
  17. package/dist/authoring/generate.js.map +1 -0
  18. package/dist/authoring/mcp.d.ts +15 -0
  19. package/dist/authoring/mcp.js +52 -0
  20. package/dist/authoring/mcp.js.map +1 -0
  21. package/dist/authoring/new.d.ts +35 -0
  22. package/dist/authoring/new.js +389 -0
  23. package/dist/authoring/new.js.map +1 -0
  24. package/dist/bdef/ast.d.ts +249 -0
  25. package/dist/bdef/ast.js +3 -0
  26. package/dist/bdef/ast.js.map +1 -0
  27. package/dist/bdef/lexer.d.ts +105 -0
  28. package/dist/bdef/lexer.js +148 -0
  29. package/dist/bdef/lexer.js.map +1 -0
  30. package/dist/bdef/parser.d.ts +22 -0
  31. package/dist/bdef/parser.js +1012 -0
  32. package/dist/bdef/parser.js.map +1 -0
  33. package/dist/build.d.ts +26 -0
  34. package/dist/build.js +62 -0
  35. package/dist/build.js.map +1 -0
  36. package/dist/cds/adapter.d.ts +91 -0
  37. package/dist/cds/adapter.js +381 -0
  38. package/dist/cds/adapter.js.map +1 -0
  39. package/dist/cds/expression-ast.d.ts +65 -0
  40. package/dist/cds/expression-ast.js +330 -0
  41. package/dist/cds/expression-ast.js.map +1 -0
  42. package/dist/cli.d.ts +9 -0
  43. package/dist/cli.js +485 -0
  44. package/dist/cli.js.map +1 -0
  45. package/dist/dcl/parser.d.ts +59 -0
  46. package/dist/dcl/parser.js +338 -0
  47. package/dist/dcl/parser.js.map +1 -0
  48. package/dist/ddic/catalog.d.ts +17 -0
  49. package/dist/ddic/catalog.js +211 -0
  50. package/dist/ddic/catalog.js.map +1 -0
  51. package/dist/ddic/cds-types.d.ts +47 -0
  52. package/dist/ddic/cds-types.js +131 -0
  53. package/dist/ddic/cds-types.js.map +1 -0
  54. package/dist/ddic/table-source.d.ts +70 -0
  55. package/dist/ddic/table-source.js +500 -0
  56. package/dist/ddic/table-source.js.map +1 -0
  57. package/dist/ddic/xml.d.ts +65 -0
  58. package/dist/ddic/xml.js +201 -0
  59. package/dist/ddic/xml.js.map +1 -0
  60. package/dist/dev.d.ts +128 -0
  61. package/dist/dev.js +434 -0
  62. package/dist/dev.js.map +1 -0
  63. package/dist/diagnostics.d.ts +33 -0
  64. package/dist/diagnostics.js +53 -0
  65. package/dist/diagnostics.js.map +1 -0
  66. package/dist/gen/abap/derived-types.d.ts +26 -0
  67. package/dist/gen/abap/derived-types.js +323 -0
  68. package/dist/gen/abap/derived-types.js.map +1 -0
  69. package/dist/gen/abap/eml.d.ts +118 -0
  70. package/dist/gen/abap/eml.js +362 -0
  71. package/dist/gen/abap/eml.js.map +1 -0
  72. package/dist/gen/abap/enums.d.ts +13 -0
  73. package/dist/gen/abap/enums.js +74 -0
  74. package/dist/gen/abap/enums.js.map +1 -0
  75. package/dist/gen/abap/framework-http.d.ts +14 -0
  76. package/dist/gen/abap/framework-http.js +1049 -0
  77. package/dist/gen/abap/framework-http.js.map +1 -0
  78. package/dist/gen/abap/framework-query.d.ts +14 -0
  79. package/dist/gen/abap/framework-query.js +225 -0
  80. package/dist/gen/abap/framework-query.js.map +1 -0
  81. package/dist/gen/abap/framework-utils.d.ts +29 -0
  82. package/dist/gen/abap/framework-utils.js +3707 -0
  83. package/dist/gen/abap/framework-utils.js.map +1 -0
  84. package/dist/gen/abap/framework.d.ts +12 -0
  85. package/dist/gen/abap/framework.js +480 -0
  86. package/dist/gen/abap/framework.js.map +1 -0
  87. package/dist/gen/abap/generate.d.ts +40 -0
  88. package/dist/gen/abap/generate.js +238 -0
  89. package/dist/gen/abap/generate.js.map +1 -0
  90. package/dist/gen/abap/rewrite.d.ts +82 -0
  91. package/dist/gen/abap/rewrite.js +957 -0
  92. package/dist/gen/abap/rewrite.js.map +1 -0
  93. package/dist/gen/abap/shadow.d.ts +25 -0
  94. package/dist/gen/abap/shadow.js +175 -0
  95. package/dist/gen/abap/shadow.js.map +1 -0
  96. package/dist/gen/abap/tokens.d.ts +33 -0
  97. package/dist/gen/abap/tokens.js +87 -0
  98. package/dist/gen/abap/tokens.js.map +1 -0
  99. package/dist/gen/app/index.d.ts +25 -0
  100. package/dist/gen/app/index.js +322 -0
  101. package/dist/gen/app/index.js.map +1 -0
  102. package/dist/gen/csdl.d.ts +11 -0
  103. package/dist/gen/csdl.js +562 -0
  104. package/dist/gen/csdl.js.map +1 -0
  105. package/dist/gen/deploy.d.ts +12 -0
  106. package/dist/gen/deploy.js +53 -0
  107. package/dist/gen/deploy.js.map +1 -0
  108. package/dist/gen/docs/index.d.ts +35 -0
  109. package/dist/gen/docs/index.js +267 -0
  110. package/dist/gen/docs/index.js.map +1 -0
  111. package/dist/gen/docs/markdown.d.ts +23 -0
  112. package/dist/gen/docs/markdown.js +187 -0
  113. package/dist/gen/docs/markdown.js.map +1 -0
  114. package/dist/gen/docs/site.d.ts +17 -0
  115. package/dist/gen/docs/site.js +106 -0
  116. package/dist/gen/docs/site.js.map +1 -0
  117. package/dist/gen/keycloak.d.ts +21 -0
  118. package/dist/gen/keycloak.js +90 -0
  119. package/dist/gen/keycloak.js.map +1 -0
  120. package/dist/gen/launchpad/index.d.ts +48 -0
  121. package/dist/gen/launchpad/index.js +302 -0
  122. package/dist/gen/launchpad/index.js.map +1 -0
  123. package/dist/gen/launchpad/ui.d.ts +14 -0
  124. package/dist/gen/launchpad/ui.js +350 -0
  125. package/dist/gen/launchpad/ui.js.map +1 -0
  126. package/dist/gen/mcp.d.ts +23 -0
  127. package/dist/gen/mcp.js +244 -0
  128. package/dist/gen/mcp.js.map +1 -0
  129. package/dist/gen/sql-expressions.d.ts +12 -0
  130. package/dist/gen/sql-expressions.js +136 -0
  131. package/dist/gen/sql-expressions.js.map +1 -0
  132. package/dist/gen/sql.d.ts +38 -0
  133. package/dist/gen/sql.js +612 -0
  134. package/dist/gen/sql.js.map +1 -0
  135. package/dist/gen/ui/index.d.ts +7 -0
  136. package/dist/gen/ui/index.js +27 -0
  137. package/dist/gen/ui/index.js.map +1 -0
  138. package/dist/gen/ui/layout.d.ts +230 -0
  139. package/dist/gen/ui/layout.js +511 -0
  140. package/dist/gen/ui/layout.js.map +1 -0
  141. package/dist/gen/ui/static.d.ts +55 -0
  142. package/dist/gen/ui/static.js +2901 -0
  143. package/dist/gen/ui/static.js.map +1 -0
  144. package/dist/gen/ui/views.d.ts +10 -0
  145. package/dist/gen/ui/views.js +511 -0
  146. package/dist/gen/ui/views.js.map +1 -0
  147. package/dist/gen/vendor.d.ts +23 -0
  148. package/dist/gen/vendor.js +68 -0
  149. package/dist/gen/vendor.js.map +1 -0
  150. package/dist/gen/xml.d.ts +9 -0
  151. package/dist/gen/xml.js +42 -0
  152. package/dist/gen/xml.js.map +1 -0
  153. package/dist/index.d.ts +20 -0
  154. package/dist/index.js +20 -0
  155. package/dist/index.js.map +1 -0
  156. package/dist/input/project.d.ts +50 -0
  157. package/dist/input/project.js +128 -0
  158. package/dist/input/project.js.map +1 -0
  159. package/dist/ir/access-controls.d.ts +11 -0
  160. package/dist/ir/access-controls.js +148 -0
  161. package/dist/ir/access-controls.js.map +1 -0
  162. package/dist/ir/authorizations.d.ts +25 -0
  163. package/dist/ir/authorizations.js +178 -0
  164. package/dist/ir/authorizations.js.map +1 -0
  165. package/dist/ir/behaviors.d.ts +16 -0
  166. package/dist/ir/behaviors.js +548 -0
  167. package/dist/ir/behaviors.js.map +1 -0
  168. package/dist/ir/builder.d.ts +20 -0
  169. package/dist/ir/builder.js +505 -0
  170. package/dist/ir/builder.js.map +1 -0
  171. package/dist/ir/config.d.ts +25 -0
  172. package/dist/ir/config.js +130 -0
  173. package/dist/ir/config.js.map +1 -0
  174. package/dist/ir/dictionary.d.ts +54 -0
  175. package/dist/ir/dictionary.js +328 -0
  176. package/dist/ir/dictionary.js.map +1 -0
  177. package/dist/ir/entities.d.ts +58 -0
  178. package/dist/ir/entities.js +676 -0
  179. package/dist/ir/entities.js.map +1 -0
  180. package/dist/ir/expressions.d.ts +33 -0
  181. package/dist/ir/expressions.js +327 -0
  182. package/dist/ir/expressions.js.map +1 -0
  183. package/dist/ir/handlers.d.ts +63 -0
  184. package/dist/ir/handlers.js +398 -0
  185. package/dist/ir/handlers.js.map +1 -0
  186. package/dist/ir/number-ranges.d.ts +24 -0
  187. package/dist/ir/number-ranges.js +74 -0
  188. package/dist/ir/number-ranges.js.map +1 -0
  189. package/dist/ir/seed.d.ts +23 -0
  190. package/dist/ir/seed.js +78 -0
  191. package/dist/ir/seed.js.map +1 -0
  192. package/dist/ir/service.d.ts +21 -0
  193. package/dist/ir/service.js +96 -0
  194. package/dist/ir/service.js.map +1 -0
  195. package/dist/launchpad/config.d.ts +47 -0
  196. package/dist/launchpad/config.js +321 -0
  197. package/dist/launchpad/config.js.map +1 -0
  198. package/dist/launchpad/workspace.d.ts +48 -0
  199. package/dist/launchpad/workspace.js +166 -0
  200. package/dist/launchpad/workspace.js.map +1 -0
  201. package/dist/srvd/parser.d.ts +36 -0
  202. package/dist/srvd/parser.js +193 -0
  203. package/dist/srvd/parser.js.map +1 -0
  204. package/dist/standard/data.d.ts +18 -0
  205. package/dist/standard/data.js +534 -0
  206. package/dist/standard/data.js.map +1 -0
  207. package/dist/standard/index.d.ts +36 -0
  208. package/dist/standard/index.js +507 -0
  209. package/dist/standard/index.js.map +1 -0
  210. package/dist/version.d.ts +2 -0
  211. package/dist/version.js +4 -0
  212. package/dist/version.js.map +1 -0
  213. package/docs/AGENTS.md +79 -0
  214. package/docs/ANNOTATIONS.md +76 -0
  215. package/docs/DECISIONS.md +1554 -0
  216. package/docs/DEPLOYMENT.md +113 -0
  217. package/docs/DIAGNOSTICS.md +116 -0
  218. package/docs/FEATURES.md +287 -0
  219. package/docs/GUIDE.md +560 -0
  220. package/docs/KNOWN_GAPS.md +216 -0
  221. package/docs/MCP.md +84 -0
  222. package/docs/PLAN.md +690 -0
  223. package/docs/README.md +148 -0
  224. package/docs/REMOTE_APIS.md +121 -0
  225. package/docs/ROADMAP.md +35 -0
  226. package/docs/UTILITIES.md +95 -0
  227. package/package.json +49 -3
@@ -0,0 +1,3707 @@
1
+ /**
2
+ * Clean-room ABAP utilities of ABAP Cloud for the behavior pools (decision D40), written from the
3
+ * public signatures documented by SAP: JSON (/ui2/cl_json, xco_cp_json), encodings
4
+ * (cl_web_http_utility, cl_abap_conv_codepage, cl_abap_gzip, xco_cp=>string / xstring), text
5
+ * (cl_abap_char_utilities, cl_abap_string_utilities), number ranges (cl_numberrange_runtime),
6
+ * date and time (cl_abap_tstmp, cl_abap_utclong, xco_cp=>sy, xco_cp_time), the application log
7
+ * (cl_bali_*), hashes (cl_abap_message_digest, cl_abap_hmac), random numbers (cl_abap_random*),
8
+ * regular expressions (cl_abap_regex, cl_abap_matcher) and the RTTS (cl_abap_typedescr and its
9
+ * subclasses). The ABAP keeps the objects; the kernel (ZRAP_EML) does what ABAP cannot: parse
10
+ * and write JSON, convert code pages, hash, compress, persist, inspect data objects.
11
+ *
12
+ * Only the objects a project uses are given to the transpiler (frameworkClosure).
13
+ */
14
+ // ------------------------------------------------------------------------------ DDIC types
15
+ const ddicHeader = (serializer) => `<?xml version="1.0" encoding="utf-8"?>
16
+ <abapGit version="v1.0.0" serializer="${serializer}" serializer_version="v1.0.0">
17
+ <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
18
+ <asx:values>
19
+ `;
20
+ const DDIC_FOOTER = ` </asx:values>
21
+ </asx:abap>
22
+ </abapGit>
23
+ `;
24
+ const structure = (name, text, fields) => ({
25
+ fileName: `${name.toLowerCase()}.tabl.xml`,
26
+ source: `${ddicHeader("LCL_OBJECT_TABL")} <DD02V>
27
+ <TABNAME>${name}</TABNAME>
28
+ <DDLANGUAGE>E</DDLANGUAGE>
29
+ <TABCLASS>INTTAB</TABCLASS>
30
+ <DDTEXT>${text}</DDTEXT>
31
+ </DD02V>
32
+ <DD03P_TABLE>
33
+ ${fields
34
+ .map((f) => f.table !== undefined
35
+ ? ` <DD03P>\n <FIELDNAME>${f.name}</FIELDNAME>\n <ROLLNAME>${f.table}</ROLLNAME>\n <COMPTYPE>L</COMPTYPE>\n </DD03P>`
36
+ : ` <DD03P>\n <FIELDNAME>${f.name}</FIELDNAME>\n <DATATYPE>${f.type}</DATATYPE>\n <LENG>${String(f.length ?? 10).padStart(6, "0")}</LENG>\n </DD03P>`)
37
+ .join("\n")}
38
+ </DD03P_TABLE>
39
+ ${DDIC_FOOTER}`,
40
+ });
41
+ const tableType = (name, text, row) => ({
42
+ fileName: `${name.toLowerCase()}.ttyp.xml`,
43
+ source: `${ddicHeader("LCL_OBJECT_TTYP")} <DD40V>
44
+ <TYPENAME>${name}</TYPENAME>
45
+ <DDLANGUAGE>E</DDLANGUAGE>
46
+ ${"structure" in row ? ` <ROWTYPE>${row.structure}</ROWTYPE>\n <ROWKIND>S</ROWKIND>\n <DATATYPE>STRU</DATATYPE>` : ` <DATATYPE>${row.datatype}</DATATYPE>`}
47
+ <ACCESSMODE>T</ACCESSMODE>
48
+ <KEYDEF>D</KEYDEF>
49
+ <KEYKIND>N</KEYKIND>
50
+ <DDTEXT>${text}</DDTEXT>
51
+ </DD40V>
52
+ ${DDIC_FOOTER}`,
53
+ });
54
+ const DDIC = [
55
+ tableType("STRING_TABLE", "Table of strings", { datatype: "STRG" }),
56
+ tableType("XSTRING_TABLE", "Table of byte strings", { datatype: "RSTR" }),
57
+ structure("SUBMATCH_RESULT", "Submatch of a regular expression", [
58
+ { name: "OFFSET", type: "INT4" },
59
+ { name: "LENGTH", type: "INT4" },
60
+ ]),
61
+ tableType("SUBMATCH_RESULT_TAB", "Submatches of a regular expression", { structure: "SUBMATCH_RESULT" }),
62
+ structure("MATCH_RESULT", "Match of a regular expression", [
63
+ { name: "LINE", type: "INT4" },
64
+ { name: "OFFSET", type: "INT4" },
65
+ { name: "LENGTH", type: "INT4" },
66
+ { name: "SUBMATCHES", table: "SUBMATCH_RESULT_TAB" },
67
+ ]),
68
+ tableType("MATCH_RESULT_TAB", "Matches of a regular expression", { structure: "MATCH_RESULT" }),
69
+ ];
70
+ /** The types of the type pool ABAP used by the RTTS (abap_compdescr_tab, abap_component_tab). */
71
+ const TYPE_POOL_ABAP = `TYPE-POOL abap.
72
+ TYPES abap_compname TYPE c LENGTH 30.
73
+ TYPES abap_typekind TYPE c LENGTH 1.
74
+ TYPES abap_abstypename TYPE c LENGTH 200.
75
+ TYPES: BEGIN OF abap_compdescr,
76
+ length TYPE i,
77
+ decimals TYPE i,
78
+ type_kind TYPE abap_typekind,
79
+ name TYPE abap_compname,
80
+ END OF abap_compdescr.
81
+ TYPES abap_compdescr_tab TYPE STANDARD TABLE OF abap_compdescr WITH DEFAULT KEY.
82
+ TYPES: BEGIN OF abap_componentdescr,
83
+ name TYPE string,
84
+ type TYPE REF TO cl_abap_datadescr,
85
+ as_include TYPE abap_bool,
86
+ suffix TYPE string,
87
+ END OF abap_componentdescr.
88
+ TYPES abap_component_tab TYPE STANDARD TABLE OF abap_componentdescr WITH DEFAULT KEY.
89
+ `;
90
+ // ------------------------------------------------------------------------------ exceptions
91
+ /** An exception with a text of its own (`zrap_text`, from cx_static_check / the http framework). */
92
+ const exception = (name, superclass) => ({
93
+ fileName: `${name}.clas.abap`,
94
+ source: `CLASS ${name} DEFINITION PUBLIC INHERITING FROM ${superclass} CREATE PUBLIC.
95
+ PUBLIC SECTION.
96
+ METHODS constructor
97
+ IMPORTING textid LIKE textid OPTIONAL
98
+ previous LIKE previous OPTIONAL
99
+ zrap_text TYPE string OPTIONAL.
100
+ ENDCLASS.
101
+
102
+ CLASS ${name} IMPLEMENTATION.
103
+ METHOD constructor.
104
+ super->constructor( textid = textid previous = previous zrap_text = zrap_text ).
105
+ ENDMETHOD.
106
+ ENDCLASS.
107
+ `,
108
+ });
109
+ /** Roots under cx_dynamic_check / cx_no_check with a text (cx_static_check has zrap_text already). */
110
+ const textRoot = (name, superclass) => ({
111
+ fileName: `${name}.clas.abap`,
112
+ source: `CLASS ${name} DEFINITION PUBLIC INHERITING FROM ${superclass} CREATE PUBLIC.
113
+ PUBLIC SECTION.
114
+ DATA zrap_text TYPE string READ-ONLY.
115
+ METHODS constructor
116
+ IMPORTING textid LIKE textid OPTIONAL
117
+ previous LIKE previous OPTIONAL
118
+ zrap_text TYPE string OPTIONAL.
119
+ ENDCLASS.
120
+
121
+ CLASS ${name} IMPLEMENTATION.
122
+ METHOD constructor.
123
+ super->constructor( textid = textid previous = previous ).
124
+ me->zrap_text = zrap_text.
125
+ ENDMETHOD.
126
+ ENDCLASS.
127
+ `,
128
+ });
129
+ const EXCEPTIONS = [
130
+ textRoot("cx_sy_conversion_codepage", "cx_sy_conversion_error"),
131
+ textRoot("cx_sy_compression_error", "cx_dynamic_check"),
132
+ textRoot("cx_sy_regex", "cx_dynamic_check"),
133
+ textRoot("cx_abap_random", "cx_dynamic_check"),
134
+ textRoot("cx_sy_rtti_type_not_released", "cx_dynamic_check"),
135
+ textRoot("cx_parameter_invalid_range", "cx_dynamic_check"),
136
+ textRoot("cx_abap_utclong_invalid", "cx_dynamic_check"),
137
+ textRoot("cx_abap_message_digest", "cx_static_check"),
138
+ textRoot("cx_number_ranges", "cx_static_check"),
139
+ exception("cx_nr_object_not_found", "cx_number_ranges"),
140
+ exception("cx_nr_subobject", "cx_number_ranges"),
141
+ textRoot("cx_bali_runtime", "cx_static_check"),
142
+ textRoot("cx_bgmc", "cx_static_check"),
143
+ textRoot("cx_bgmc_operation", "cx_static_check"),
144
+ textRoot("cx_bcs_mail", "cx_static_check"),
145
+ exception("cx_bali_not_possible", "cx_bali_runtime"),
146
+ exception("cx_bali_invalid_parameter", "cx_bali_runtime"),
147
+ ];
148
+ // ------------------------------------------------------------------------------ JSON
149
+ const UI2_CL_JSON = `CLASS /ui2/cl_json DEFINITION PUBLIC CREATE PUBLIC.
150
+ PUBLIC SECTION.
151
+ TYPES json TYPE string.
152
+ TYPES bool TYPE c LENGTH 1.
153
+ TYPES pretty_name_mode TYPE c LENGTH 1.
154
+ TYPES: BEGIN OF name_mapping,
155
+ abap TYPE abap_compname,
156
+ json TYPE string,
157
+ END OF name_mapping.
158
+ TYPES name_mappings TYPE HASHED TABLE OF name_mapping WITH UNIQUE KEY abap.
159
+ CONSTANTS:
160
+ BEGIN OF pretty_mode,
161
+ none TYPE pretty_name_mode VALUE ' ',
162
+ low_case TYPE pretty_name_mode VALUE 'L',
163
+ camel_case TYPE pretty_name_mode VALUE 'X',
164
+ extended TYPE pretty_name_mode VALUE 'Y',
165
+ user TYPE pretty_name_mode VALUE 'U',
166
+ user_low_case TYPE pretty_name_mode VALUE 'C',
167
+ END OF pretty_mode.
168
+ CONSTANTS:
169
+ BEGIN OF c_bool,
170
+ true TYPE bool VALUE 'X',
171
+ false TYPE bool VALUE ' ',
172
+ END OF c_bool.
173
+ CLASS-METHODS serialize
174
+ IMPORTING data TYPE data
175
+ compress TYPE bool DEFAULT c_bool-false
176
+ name TYPE string OPTIONAL
177
+ pretty_name TYPE pretty_name_mode DEFAULT pretty_mode-none
178
+ assoc_arrays TYPE bool DEFAULT c_bool-false
179
+ ts_as_iso8601 TYPE bool DEFAULT c_bool-false
180
+ expand_includes TYPE bool DEFAULT c_bool-true
181
+ assoc_arrays_opt TYPE bool DEFAULT c_bool-false
182
+ numc_as_string TYPE bool DEFAULT c_bool-false
183
+ name_mappings TYPE name_mappings OPTIONAL
184
+ conversion_exits TYPE bool DEFAULT c_bool-false
185
+ format_output TYPE bool DEFAULT c_bool-false
186
+ hex_as_base64 TYPE bool DEFAULT c_bool-true
187
+ RETURNING VALUE(r_json) TYPE json.
188
+ CLASS-METHODS deserialize
189
+ IMPORTING json TYPE json OPTIONAL
190
+ jsonx TYPE xstring OPTIONAL
191
+ pretty_name TYPE pretty_name_mode DEFAULT pretty_mode-none
192
+ assoc_arrays TYPE bool DEFAULT c_bool-false
193
+ assoc_arrays_opt TYPE bool DEFAULT c_bool-false
194
+ name_mappings TYPE name_mappings OPTIONAL
195
+ conversion_exits TYPE bool DEFAULT c_bool-false
196
+ hex_as_base64 TYPE bool DEFAULT c_bool-true
197
+ CHANGING data TYPE data.
198
+ PRIVATE SECTION.
199
+ CLASS-METHODS mappings_text
200
+ IMPORTING name_mappings TYPE name_mappings
201
+ RETURNING VALUE(text) TYPE string.
202
+ ENDCLASS.
203
+
204
+ CLASS /ui2/cl_json IMPLEMENTATION.
205
+ METHOD mappings_text.
206
+ DATA mapping TYPE name_mapping.
207
+ LOOP AT name_mappings INTO mapping.
208
+ text = text && mapping-abap && |\\t| && mapping-json && |\\n|.
209
+ ENDLOOP.
210
+ ENDMETHOD.
211
+
212
+ METHOD serialize.
213
+ r_json = zrap_eml=>json_serialize( data = data
214
+ mode = |{ pretty_name }|
215
+ compress = compress
216
+ numc_as_string = numc_as_string
217
+ ts_as_iso8601 = ts_as_iso8601
218
+ hex_as_base64 = hex_as_base64
219
+ format_output = format_output
220
+ booleans = abap_true
221
+ mappings = mappings_text( name_mappings ) ).
222
+ IF name IS NOT INITIAL.
223
+ r_json = |\\{"{ name }":{ r_json }\\}|.
224
+ ENDIF.
225
+ ENDMETHOD.
226
+
227
+ METHOD deserialize.
228
+ DATA text TYPE string.
229
+ text = json.
230
+ IF text IS INITIAL AND jsonx IS NOT INITIAL.
231
+ text = zrap_eml=>codepage_in( codepage = \`UTF-8\` source = jsonx ).
232
+ ENDIF.
233
+ IF text IS INITIAL.
234
+ RETURN.
235
+ ENDIF.
236
+ zrap_eml=>json_deserialize( EXPORTING json = text
237
+ mode = |{ pretty_name }|
238
+ hex_as_base64 = hex_as_base64
239
+ mappings = mappings_text( name_mappings )
240
+ CHANGING data = data ).
241
+ ENDMETHOD.
242
+ ENDCLASS.
243
+ `;
244
+ const IF_XCO_CP_JSON_TRANSFORMATION = `INTERFACE if_xco_cp_json_transformation PUBLIC.
245
+ DATA kind TYPE string READ-ONLY.
246
+ ENDINTERFACE.
247
+ `;
248
+ const ZRAP_CL_XCO_JSON_TRANSFORMATION = `CLASS zrap_cl_xco_json_trafo DEFINITION PUBLIC FINAL CREATE PUBLIC.
249
+ PUBLIC SECTION.
250
+ INTERFACES if_xco_cp_json_transformation.
251
+ METHODS constructor IMPORTING kind TYPE string.
252
+ ENDCLASS.
253
+
254
+ CLASS zrap_cl_xco_json_trafo IMPLEMENTATION.
255
+ METHOD constructor.
256
+ if_xco_cp_json_transformation~kind = kind.
257
+ ENDMETHOD.
258
+ ENDCLASS.
259
+ `;
260
+ const ZRAP_CL_XCO_JSON_TRAFOS = `CLASS zrap_cl_xco_json_trafos DEFINITION PUBLIC FINAL CREATE PUBLIC.
261
+ PUBLIC SECTION.
262
+ DATA camel_case_to_underscore TYPE REF TO if_xco_cp_json_transformation READ-ONLY.
263
+ DATA underscore_to_camel_case TYPE REF TO if_xco_cp_json_transformation READ-ONLY.
264
+ DATA pascal_case_to_underscore TYPE REF TO if_xco_cp_json_transformation READ-ONLY.
265
+ DATA underscore_to_pascal_case TYPE REF TO if_xco_cp_json_transformation READ-ONLY.
266
+ DATA boolean_to_abap_bool TYPE REF TO if_xco_cp_json_transformation READ-ONLY.
267
+ DATA abap_bool_to_boolean TYPE REF TO if_xco_cp_json_transformation READ-ONLY.
268
+ METHODS constructor.
269
+ ENDCLASS.
270
+
271
+ CLASS zrap_cl_xco_json_trafos IMPLEMENTATION.
272
+ METHOD constructor.
273
+ camel_case_to_underscore = NEW zrap_cl_xco_json_trafo( \`camel_case_to_underscore\` ).
274
+ underscore_to_camel_case = NEW zrap_cl_xco_json_trafo( \`underscore_to_camel_case\` ).
275
+ pascal_case_to_underscore = NEW zrap_cl_xco_json_trafo( \`pascal_case_to_underscore\` ).
276
+ underscore_to_pascal_case = NEW zrap_cl_xco_json_trafo( \`underscore_to_pascal_case\` ).
277
+ boolean_to_abap_bool = NEW zrap_cl_xco_json_trafo( \`boolean_to_abap_bool\` ).
278
+ abap_bool_to_boolean = NEW zrap_cl_xco_json_trafo( \`abap_bool_to_boolean\` ).
279
+ ENDMETHOD.
280
+ ENDCLASS.
281
+ `;
282
+ const IF_XCO_CP_JSON_DATA = `INTERFACE if_xco_cp_json_data PUBLIC.
283
+ TYPES tt_transformations TYPE STANDARD TABLE OF REF TO if_xco_cp_json_transformation WITH EMPTY KEY.
284
+ METHODS apply
285
+ IMPORTING it_transformations TYPE tt_transformations
286
+ RETURNING VALUE(ro_json_data) TYPE REF TO if_xco_cp_json_data.
287
+ METHODS to_string
288
+ RETURNING VALUE(rv_string) TYPE string.
289
+ METHODS write_to
290
+ IMPORTING ia_data TYPE REF TO data.
291
+ ENDINTERFACE.
292
+ `;
293
+ const ZRAP_CL_XCO_JSON_DATA = `CLASS zrap_cl_xco_json_data DEFINITION PUBLIC FINAL CREATE PUBLIC.
294
+ PUBLIC SECTION.
295
+ INTERFACES if_xco_cp_json_data.
296
+ METHODS constructor IMPORTING json TYPE string.
297
+ PRIVATE SECTION.
298
+ DATA json TYPE string.
299
+ ENDCLASS.
300
+
301
+ CLASS zrap_cl_xco_json_data IMPLEMENTATION.
302
+ METHOD constructor.
303
+ me->json = json.
304
+ ENDMETHOD.
305
+
306
+ METHOD if_xco_cp_json_data~apply.
307
+ DATA kinds TYPE string.
308
+ DATA transformation TYPE REF TO if_xco_cp_json_transformation.
309
+ LOOP AT it_transformations INTO transformation.
310
+ kinds = kinds && transformation->kind && \` \`.
311
+ ENDLOOP.
312
+ ro_json_data = NEW zrap_cl_xco_json_data( zrap_eml=>json_transform( json = json kinds = kinds ) ).
313
+ ENDMETHOD.
314
+
315
+ METHOD if_xco_cp_json_data~to_string.
316
+ rv_string = json.
317
+ ENDMETHOD.
318
+
319
+ METHOD if_xco_cp_json_data~write_to.
320
+ FIELD-SYMBOLS <data> TYPE any.
321
+ ASSIGN ia_data->* TO <data>.
322
+ zrap_eml=>json_deserialize( EXPORTING json = json mode = \`xco\` CHANGING data = <data> ).
323
+ ENDMETHOD.
324
+ ENDCLASS.
325
+ `;
326
+ const IF_XCO_CP_JSON_DATA_BUILDER = `INTERFACE if_xco_cp_json_data_builder PUBLIC.
327
+ METHODS begin_object RETURNING VALUE(ro_builder) TYPE REF TO if_xco_cp_json_data_builder.
328
+ METHODS end_object RETURNING VALUE(ro_builder) TYPE REF TO if_xco_cp_json_data_builder.
329
+ METHODS begin_array RETURNING VALUE(ro_builder) TYPE REF TO if_xco_cp_json_data_builder.
330
+ METHODS end_array RETURNING VALUE(ro_builder) TYPE REF TO if_xco_cp_json_data_builder.
331
+ METHODS add_member
332
+ IMPORTING iv_name TYPE csequence
333
+ RETURNING VALUE(ro_builder) TYPE REF TO if_xco_cp_json_data_builder.
334
+ METHODS add_string
335
+ IMPORTING iv_value TYPE csequence
336
+ RETURNING VALUE(ro_builder) TYPE REF TO if_xco_cp_json_data_builder.
337
+ METHODS add_number
338
+ IMPORTING iv_value TYPE simple
339
+ RETURNING VALUE(ro_builder) TYPE REF TO if_xco_cp_json_data_builder.
340
+ METHODS add_boolean
341
+ IMPORTING iv_value TYPE abap_bool
342
+ RETURNING VALUE(ro_builder) TYPE REF TO if_xco_cp_json_data_builder.
343
+ METHODS add_null RETURNING VALUE(ro_builder) TYPE REF TO if_xco_cp_json_data_builder.
344
+ METHODS get_data RETURNING VALUE(ro_json_data) TYPE REF TO if_xco_cp_json_data.
345
+ ENDINTERFACE.
346
+ `;
347
+ const ZRAP_CL_XCO_JSON_BUILDER = `CLASS zrap_cl_xco_json_builder DEFINITION PUBLIC FINAL CREATE PUBLIC.
348
+ PUBLIC SECTION.
349
+ INTERFACES if_xco_cp_json_data_builder.
350
+ PRIVATE SECTION.
351
+ DATA json TYPE string.
352
+ "! One flag per open object or array: a value was written (a comma comes before the next).
353
+ DATA filled TYPE STANDARD TABLE OF abap_bool WITH EMPTY KEY.
354
+ DATA after_member TYPE abap_bool.
355
+ METHODS value IMPORTING text TYPE string.
356
+ METHODS open IMPORTING text TYPE string.
357
+ METHODS close IMPORTING text TYPE string.
358
+ ENDCLASS.
359
+
360
+ CLASS zrap_cl_xco_json_builder IMPLEMENTATION.
361
+ METHOD value.
362
+ DATA count TYPE i.
363
+ count = lines( filled ).
364
+ IF after_member = abap_false AND count > 0.
365
+ IF filled[ count ] = abap_true.
366
+ json = json && \`,\`.
367
+ ENDIF.
368
+ MODIFY filled FROM abap_true INDEX count.
369
+ ENDIF.
370
+ after_member = abap_false.
371
+ json = json && text.
372
+ ENDMETHOD.
373
+
374
+ METHOD open.
375
+ value( text ).
376
+ APPEND abap_false TO filled.
377
+ ENDMETHOD.
378
+
379
+ METHOD close.
380
+ DELETE filled INDEX lines( filled ).
381
+ json = json && text.
382
+ ENDMETHOD.
383
+
384
+ METHOD if_xco_cp_json_data_builder~begin_object.
385
+ open( \`{\` ).
386
+ ro_builder = me.
387
+ ENDMETHOD.
388
+
389
+ METHOD if_xco_cp_json_data_builder~end_object.
390
+ close( \`}\` ).
391
+ ro_builder = me.
392
+ ENDMETHOD.
393
+
394
+ METHOD if_xco_cp_json_data_builder~begin_array.
395
+ open( \`[\` ).
396
+ ro_builder = me.
397
+ ENDMETHOD.
398
+
399
+ METHOD if_xco_cp_json_data_builder~end_array.
400
+ close( \`]\` ).
401
+ ro_builder = me.
402
+ ENDMETHOD.
403
+
404
+ METHOD if_xco_cp_json_data_builder~add_member.
405
+ value( zrap_eml=>json_quote( |{ iv_name }| ) && \`:\` ).
406
+ after_member = abap_true.
407
+ ro_builder = me.
408
+ ENDMETHOD.
409
+
410
+ METHOD if_xco_cp_json_data_builder~add_string.
411
+ value( zrap_eml=>json_quote( |{ iv_value }| ) ).
412
+ ro_builder = me.
413
+ ENDMETHOD.
414
+
415
+ METHOD if_xco_cp_json_data_builder~add_number.
416
+ DATA text TYPE string.
417
+ text = |{ iv_value }|.
418
+ CONDENSE text NO-GAPS.
419
+ value( text ).
420
+ ro_builder = me.
421
+ ENDMETHOD.
422
+
423
+ METHOD if_xco_cp_json_data_builder~add_boolean.
424
+ IF iv_value = abap_true.
425
+ value( \`true\` ).
426
+ ELSE.
427
+ value( \`false\` ).
428
+ ENDIF.
429
+ ro_builder = me.
430
+ ENDMETHOD.
431
+
432
+ METHOD if_xco_cp_json_data_builder~add_null.
433
+ value( \`null\` ).
434
+ ro_builder = me.
435
+ ENDMETHOD.
436
+
437
+ METHOD if_xco_cp_json_data_builder~get_data.
438
+ ro_json_data = NEW zrap_cl_xco_json_data( json ).
439
+ ENDMETHOD.
440
+ ENDCLASS.
441
+ `;
442
+ const IF_XCO_CP_JSON_DATA_FACTORY = `INTERFACE if_xco_cp_json_data_factory PUBLIC.
443
+ METHODS from_string
444
+ IMPORTING iv_string TYPE string
445
+ RETURNING VALUE(ro_json_data) TYPE REF TO if_xco_cp_json_data.
446
+ METHODS from_abap
447
+ IMPORTING ia_abap TYPE any
448
+ RETURNING VALUE(ro_json_data) TYPE REF TO if_xco_cp_json_data.
449
+ METHODS builder
450
+ RETURNING VALUE(ro_builder) TYPE REF TO if_xco_cp_json_data_builder.
451
+ ENDINTERFACE.
452
+ `;
453
+ const ZRAP_CL_XCO_JSON_FACTORY = `CLASS zrap_cl_xco_json_factory DEFINITION PUBLIC FINAL CREATE PUBLIC.
454
+ PUBLIC SECTION.
455
+ INTERFACES if_xco_cp_json_data_factory.
456
+ ENDCLASS.
457
+
458
+ CLASS zrap_cl_xco_json_factory IMPLEMENTATION.
459
+ METHOD if_xco_cp_json_data_factory~from_string.
460
+ ro_json_data = NEW zrap_cl_xco_json_data( iv_string ).
461
+ ENDMETHOD.
462
+
463
+ METHOD if_xco_cp_json_data_factory~from_abap.
464
+ ro_json_data = NEW zrap_cl_xco_json_data( zrap_eml=>json_serialize( data = ia_abap mode = \`xco\` numc_as_string = abap_true ) ).
465
+ ENDMETHOD.
466
+
467
+ METHOD if_xco_cp_json_data_factory~builder.
468
+ ro_builder = NEW zrap_cl_xco_json_builder( ).
469
+ ENDMETHOD.
470
+ ENDCLASS.
471
+ `;
472
+ const XCO_CP_JSON = `CLASS xco_cp_json DEFINITION PUBLIC FINAL CREATE PRIVATE.
473
+ PUBLIC SECTION.
474
+ CLASS-DATA data TYPE REF TO if_xco_cp_json_data_factory READ-ONLY.
475
+ CLASS-DATA transformation TYPE REF TO zrap_cl_xco_json_trafos READ-ONLY.
476
+ CLASS-METHODS class_constructor.
477
+ ENDCLASS.
478
+
479
+ CLASS xco_cp_json IMPLEMENTATION.
480
+ METHOD class_constructor.
481
+ data = NEW zrap_cl_xco_json_factory( ).
482
+ transformation = NEW zrap_cl_xco_json_trafos( ).
483
+ ENDMETHOD.
484
+ ENDCLASS.
485
+ `;
486
+ // ------------------------------------------------------------------------------ encodings and text
487
+ const CL_WEB_HTTP_UTILITY = `CLASS cl_web_http_utility DEFINITION PUBLIC FINAL CREATE PRIVATE.
488
+ PUBLIC SECTION.
489
+ CLASS-METHODS encode_base64
490
+ IMPORTING unencoded TYPE string
491
+ RETURNING VALUE(encoded) TYPE string.
492
+ CLASS-METHODS decode_base64
493
+ IMPORTING encoded TYPE string
494
+ RETURNING VALUE(decoded) TYPE string.
495
+ CLASS-METHODS encode_x_base64
496
+ IMPORTING unencoded TYPE xstring
497
+ RETURNING VALUE(encoded) TYPE string.
498
+ CLASS-METHODS decode_x_base64
499
+ IMPORTING encoded TYPE string
500
+ RETURNING VALUE(decoded) TYPE xstring.
501
+ CLASS-METHODS encode_utf8
502
+ IMPORTING unencoded TYPE string
503
+ RETURNING VALUE(encoded) TYPE xstring.
504
+ CLASS-METHODS decode_utf8
505
+ IMPORTING encoded TYPE xstring
506
+ RETURNING VALUE(decoded) TYPE string.
507
+ CLASS-METHODS escape_url
508
+ IMPORTING unescaped TYPE string
509
+ RETURNING VALUE(escaped) TYPE string.
510
+ CLASS-METHODS unescape_url
511
+ IMPORTING escaped TYPE string
512
+ RETURNING VALUE(unescaped) TYPE string.
513
+ CLASS-METHODS escape_html
514
+ IMPORTING unescaped TYPE string
515
+ RETURNING VALUE(escaped) TYPE string.
516
+ ENDCLASS.
517
+
518
+ CLASS cl_web_http_utility IMPLEMENTATION.
519
+ METHOD encode_base64.
520
+ encoded = zrap_eml=>base64_encode( unencoded ).
521
+ ENDMETHOD.
522
+
523
+ METHOD decode_base64.
524
+ decoded = zrap_eml=>codepage_in( codepage = \`UTF-8\` source = zrap_eml=>base64_decode( encoded ) ).
525
+ ENDMETHOD.
526
+
527
+ METHOD encode_x_base64.
528
+ encoded = zrap_eml=>base64_encode_x( unencoded ).
529
+ ENDMETHOD.
530
+
531
+ METHOD decode_x_base64.
532
+ decoded = zrap_eml=>base64_decode( encoded ).
533
+ ENDMETHOD.
534
+
535
+ METHOD encode_utf8.
536
+ encoded = zrap_eml=>codepage_out( codepage = \`UTF-8\` source = unencoded ).
537
+ ENDMETHOD.
538
+
539
+ METHOD decode_utf8.
540
+ decoded = zrap_eml=>codepage_in( codepage = \`UTF-8\` source = encoded ).
541
+ ENDMETHOD.
542
+
543
+ METHOD escape_url.
544
+ escaped = zrap_eml=>text_escape( format = \`url\` text = unescaped ).
545
+ ENDMETHOD.
546
+
547
+ METHOD unescape_url.
548
+ unescaped = zrap_eml=>text_escape( format = \`url_unescape\` text = escaped ).
549
+ ENDMETHOD.
550
+
551
+ METHOD escape_html.
552
+ escaped = zrap_eml=>text_escape( format = \`html\` text = unescaped ).
553
+ ENDMETHOD.
554
+ ENDCLASS.
555
+ `;
556
+ const IF_ABAP_CONV_OUT = `INTERFACE if_abap_conv_out PUBLIC.
557
+ METHODS convert
558
+ IMPORTING source TYPE csequence
559
+ RETURNING VALUE(result) TYPE xstring
560
+ RAISING cx_sy_conversion_codepage.
561
+ ENDINTERFACE.
562
+ `;
563
+ const IF_ABAP_CONV_IN = `INTERFACE if_abap_conv_in PUBLIC.
564
+ METHODS convert
565
+ IMPORTING source TYPE xsequence
566
+ RETURNING VALUE(result) TYPE string
567
+ RAISING cx_sy_conversion_codepage.
568
+ ENDINTERFACE.
569
+ `;
570
+ const CL_ABAP_CONV_CODEPAGE = `CLASS cl_abap_conv_codepage DEFINITION PUBLIC FINAL CREATE PRIVATE.
571
+ PUBLIC SECTION.
572
+ INTERFACES if_abap_conv_out.
573
+ INTERFACES if_abap_conv_in.
574
+ CLASS-METHODS create_out
575
+ IMPORTING codepage TYPE string DEFAULT \`UTF-8\`
576
+ replacement TYPE string OPTIONAL
577
+ ignore_cerr TYPE abap_bool DEFAULT abap_false
578
+ RETURNING VALUE(instance) TYPE REF TO if_abap_conv_out
579
+ RAISING cx_parameter_invalid_range.
580
+ CLASS-METHODS create_in
581
+ IMPORTING codepage TYPE string DEFAULT \`UTF-8\`
582
+ replacement TYPE string OPTIONAL
583
+ ignore_cerr TYPE abap_bool DEFAULT abap_false
584
+ RETURNING VALUE(instance) TYPE REF TO if_abap_conv_in
585
+ RAISING cx_parameter_invalid_range.
586
+ METHODS constructor IMPORTING codepage TYPE string.
587
+ PRIVATE SECTION.
588
+ DATA codepage TYPE string.
589
+ ENDCLASS.
590
+
591
+ CLASS cl_abap_conv_codepage IMPLEMENTATION.
592
+ METHOD constructor.
593
+ me->codepage = codepage.
594
+ ENDMETHOD.
595
+
596
+ METHOD create_out.
597
+ zrap_eml=>codepage_check( codepage ).
598
+ instance = NEW cl_abap_conv_codepage( codepage ).
599
+ ENDMETHOD.
600
+
601
+ METHOD create_in.
602
+ zrap_eml=>codepage_check( codepage ).
603
+ instance = NEW cl_abap_conv_codepage( codepage ).
604
+ ENDMETHOD.
605
+
606
+ METHOD if_abap_conv_out~convert.
607
+ result = zrap_eml=>codepage_out( codepage = codepage source = |{ source }| ).
608
+ ENDMETHOD.
609
+
610
+ METHOD if_abap_conv_in~convert.
611
+ DATA bytes TYPE xstring.
612
+ bytes = source.
613
+ result = zrap_eml=>codepage_in( codepage = codepage source = bytes ).
614
+ ENDMETHOD.
615
+ ENDCLASS.
616
+ `;
617
+ const CL_ABAP_GZIP = `CLASS cl_abap_gzip DEFINITION PUBLIC FINAL CREATE PRIVATE.
618
+ PUBLIC SECTION.
619
+ CLASS-METHODS compress_binary
620
+ IMPORTING raw_in TYPE xsequence
621
+ EXPORTING gzip_out TYPE xstring
622
+ gzip_out_len TYPE i
623
+ RAISING cx_sy_compression_error.
624
+ CLASS-METHODS decompress_binary
625
+ IMPORTING gzip_in TYPE xsequence
626
+ EXPORTING raw_out TYPE xstring
627
+ raw_out_len TYPE i
628
+ RAISING cx_sy_compression_error.
629
+ CLASS-METHODS compress_text
630
+ IMPORTING text_in TYPE csequence
631
+ EXPORTING gzip_out TYPE xstring
632
+ gzip_out_len TYPE i
633
+ RAISING cx_sy_compression_error.
634
+ CLASS-METHODS decompress_text
635
+ IMPORTING gzip_in TYPE xsequence
636
+ EXPORTING text_out TYPE string
637
+ text_out_len TYPE i
638
+ RAISING cx_sy_compression_error.
639
+ ENDCLASS.
640
+
641
+ CLASS cl_abap_gzip IMPLEMENTATION.
642
+ METHOD compress_binary.
643
+ DATA bytes TYPE xstring.
644
+ bytes = raw_in.
645
+ gzip_out = zrap_eml=>gzip( operation = \`compress\` source = bytes ).
646
+ gzip_out_len = xstrlen( gzip_out ).
647
+ ENDMETHOD.
648
+
649
+ METHOD decompress_binary.
650
+ DATA bytes TYPE xstring.
651
+ bytes = gzip_in.
652
+ raw_out = zrap_eml=>gzip( operation = \`decompress\` source = bytes ).
653
+ raw_out_len = xstrlen( raw_out ).
654
+ ENDMETHOD.
655
+
656
+ METHOD compress_text.
657
+ gzip_out = zrap_eml=>gzip( operation = \`compress\` source = zrap_eml=>codepage_out( codepage = \`UTF-8\` source = |{ text_in }| ) ).
658
+ gzip_out_len = xstrlen( gzip_out ).
659
+ ENDMETHOD.
660
+
661
+ METHOD decompress_text.
662
+ DATA bytes TYPE xstring.
663
+ bytes = gzip_in.
664
+ text_out = zrap_eml=>codepage_in( codepage = \`UTF-8\` source = zrap_eml=>gzip( operation = \`decompress\` source = bytes ) ).
665
+ text_out_len = strlen( text_out ).
666
+ ENDMETHOD.
667
+ ENDCLASS.
668
+ `;
669
+ const CL_ABAP_CHAR_UTILITIES = `CLASS cl_abap_char_utilities DEFINITION PUBLIC FINAL CREATE PRIVATE.
670
+ PUBLIC SECTION.
671
+ CLASS-DATA newline TYPE c LENGTH 1 READ-ONLY.
672
+ CLASS-DATA cr_lf TYPE c LENGTH 2 READ-ONLY.
673
+ CLASS-DATA horizontal_tab TYPE c LENGTH 1 READ-ONLY.
674
+ CLASS-DATA vertical_tab TYPE c LENGTH 1 READ-ONLY.
675
+ CLASS-DATA form_feed TYPE c LENGTH 1 READ-ONLY.
676
+ CLASS-DATA backspace TYPE c LENGTH 1 READ-ONLY.
677
+ CLASS-DATA maxchar TYPE c LENGTH 1 READ-ONLY.
678
+ CLASS-DATA byte_order_mark_utf8 TYPE x LENGTH 3 READ-ONLY.
679
+ CONSTANTS charsize TYPE i VALUE 2.
680
+ CONSTANTS endian TYPE c LENGTH 1 VALUE 'L'.
681
+ CLASS-METHODS class_constructor.
682
+ ENDCLASS.
683
+
684
+ CLASS cl_abap_char_utilities IMPLEMENTATION.
685
+ METHOD class_constructor.
686
+ newline = |\\n|.
687
+ cr_lf = |\\r\\n|.
688
+ horizontal_tab = |\\t|.
689
+ " the class constructor runs when the module loads, before the kernel: the characters are literals
690
+ vertical_tab = \`\v\`.
691
+ form_feed = \`\f\`.
692
+ backspace = \`\b\`.
693
+ maxchar = \`\uFFFD\`.
694
+ byte_order_mark_utf8 = 'EFBBBF'.
695
+ ENDMETHOD.
696
+ ENDCLASS.
697
+ `;
698
+ const CL_ABAP_STRING_UTILITIES = `CLASS cl_abap_string_utilities DEFINITION PUBLIC FINAL CREATE PRIVATE.
699
+ PUBLIC SECTION.
700
+ CLASS-METHODS del_trailing_blanks
701
+ CHANGING str TYPE string.
702
+ CLASS-METHODS c2str_preserving_blanks
703
+ IMPORTING source TYPE c
704
+ EXPORTING dest TYPE string.
705
+ ENDCLASS.
706
+
707
+ CLASS cl_abap_string_utilities IMPLEMENTATION.
708
+ METHOD del_trailing_blanks.
709
+ str = zrap_eml=>text_escape( format = \`rtrim\` text = str ).
710
+ ENDMETHOD.
711
+
712
+ METHOD c2str_preserving_blanks.
713
+ dest = zrap_eml=>chars_raw( source ).
714
+ ENDMETHOD.
715
+ ENDCLASS.
716
+ `;
717
+ // ------------------------------------------------------------------------------ XCO: strings, time, sy
718
+ const ZRAP_CL_XCO_ENCODING = `CLASS zrap_cl_xco_encoding DEFINITION PUBLIC FINAL CREATE PUBLIC.
719
+ PUBLIC SECTION.
720
+ "! UTF-8, UTF-16 … (code page) or base64 (text encoding of binary data).
721
+ DATA value TYPE string READ-ONLY.
722
+ METHODS constructor IMPORTING value TYPE string.
723
+ ENDCLASS.
724
+
725
+ CLASS zrap_cl_xco_encoding IMPLEMENTATION.
726
+ METHOD constructor.
727
+ me->value = value.
728
+ ENDMETHOD.
729
+ ENDCLASS.
730
+ `;
731
+ const ZRAP_CL_XCO_CODE_PAGES = `CLASS zrap_cl_xco_code_pages DEFINITION PUBLIC FINAL CREATE PUBLIC.
732
+ PUBLIC SECTION.
733
+ DATA utf_8 TYPE REF TO zrap_cl_xco_encoding READ-ONLY.
734
+ DATA utf_16 TYPE REF TO zrap_cl_xco_encoding READ-ONLY.
735
+ DATA utf_16le TYPE REF TO zrap_cl_xco_encoding READ-ONLY.
736
+ DATA utf_16be TYPE REF TO zrap_cl_xco_encoding READ-ONLY.
737
+ DATA iso_8859_1 TYPE REF TO zrap_cl_xco_encoding READ-ONLY.
738
+ DATA us_ascii TYPE REF TO zrap_cl_xco_encoding READ-ONLY.
739
+ METHODS constructor.
740
+ ENDCLASS.
741
+
742
+ CLASS zrap_cl_xco_code_pages IMPLEMENTATION.
743
+ METHOD constructor.
744
+ utf_8 = NEW zrap_cl_xco_encoding( \`UTF-8\` ).
745
+ utf_16 = NEW zrap_cl_xco_encoding( \`UTF-16\` ).
746
+ utf_16le = NEW zrap_cl_xco_encoding( \`UTF-16LE\` ).
747
+ utf_16be = NEW zrap_cl_xco_encoding( \`UTF-16BE\` ).
748
+ iso_8859_1 = NEW zrap_cl_xco_encoding( \`ISO-8859-1\` ).
749
+ us_ascii = NEW zrap_cl_xco_encoding( \`US-ASCII\` ).
750
+ ENDMETHOD.
751
+ ENDCLASS.
752
+ `;
753
+ const XCO_CP_CHARACTER = `CLASS xco_cp_character DEFINITION PUBLIC FINAL CREATE PRIVATE.
754
+ PUBLIC SECTION.
755
+ CLASS-DATA code_page TYPE REF TO zrap_cl_xco_code_pages READ-ONLY.
756
+ CLASS-METHODS class_constructor.
757
+ ENDCLASS.
758
+
759
+ CLASS xco_cp_character IMPLEMENTATION.
760
+ METHOD class_constructor.
761
+ code_page = NEW zrap_cl_xco_code_pages( ).
762
+ ENDMETHOD.
763
+ ENDCLASS.
764
+ `;
765
+ const ZRAP_CL_XCO_TEXT_ENCODINGS = `CLASS zrap_cl_xco_text_encodings DEFINITION PUBLIC FINAL CREATE PUBLIC.
766
+ PUBLIC SECTION.
767
+ DATA base64 TYPE REF TO zrap_cl_xco_encoding READ-ONLY.
768
+ METHODS constructor.
769
+ ENDCLASS.
770
+
771
+ CLASS zrap_cl_xco_text_encodings IMPLEMENTATION.
772
+ METHOD constructor.
773
+ base64 = NEW zrap_cl_xco_encoding( \`BASE64\` ).
774
+ ENDMETHOD.
775
+ ENDCLASS.
776
+ `;
777
+ const XCO_CP_BINARY = `CLASS xco_cp_binary DEFINITION PUBLIC FINAL CREATE PRIVATE.
778
+ PUBLIC SECTION.
779
+ CLASS-DATA text_encoding TYPE REF TO zrap_cl_xco_text_encodings READ-ONLY.
780
+ CLASS-METHODS class_constructor.
781
+ ENDCLASS.
782
+
783
+ CLASS xco_cp_binary IMPLEMENTATION.
784
+ METHOD class_constructor.
785
+ text_encoding = NEW zrap_cl_xco_text_encodings( ).
786
+ ENDMETHOD.
787
+ ENDCLASS.
788
+ `;
789
+ const ZRAP_CL_XCO_STRING = `CLASS zrap_cl_xco_string DEFINITION PUBLIC FINAL CREATE PUBLIC.
790
+ PUBLIC SECTION.
791
+ DATA value TYPE string READ-ONLY.
792
+ METHODS constructor IMPORTING value TYPE string.
793
+ METHODS as_xstring
794
+ IMPORTING io_encoding TYPE REF TO zrap_cl_xco_encoding
795
+ RETURNING VALUE(ro_xstring) TYPE REF TO zrap_cl_xco_xstring.
796
+ METHODS to_upper_case RETURNING VALUE(ro_string) TYPE REF TO zrap_cl_xco_string.
797
+ METHODS to_lower_case RETURNING VALUE(ro_string) TYPE REF TO zrap_cl_xco_string.
798
+ METHODS append
799
+ IMPORTING iv_string TYPE csequence
800
+ RETURNING VALUE(ro_string) TYPE REF TO zrap_cl_xco_string.
801
+ METHODS prepend
802
+ IMPORTING iv_string TYPE csequence
803
+ RETURNING VALUE(ro_string) TYPE REF TO zrap_cl_xco_string.
804
+ METHODS split
805
+ IMPORTING iv_delimiter TYPE csequence
806
+ RETURNING VALUE(ro_strings) TYPE REF TO zrap_cl_xco_strings.
807
+ METHODS starts_with
808
+ IMPORTING iv_value TYPE csequence
809
+ RETURNING VALUE(rv_starts_with) TYPE abap_bool.
810
+ METHODS ends_with
811
+ IMPORTING iv_value TYPE csequence
812
+ RETURNING VALUE(rv_ends_with) TYPE abap_bool.
813
+ METHODS get_length RETURNING VALUE(rv_length) TYPE i.
814
+ ENDCLASS.
815
+
816
+ CLASS zrap_cl_xco_string IMPLEMENTATION.
817
+ METHOD constructor.
818
+ me->value = value.
819
+ ENDMETHOD.
820
+
821
+ METHOD as_xstring.
822
+ IF io_encoding->value = \`BASE64\`.
823
+ ro_xstring = NEW zrap_cl_xco_xstring( zrap_eml=>base64_decode( value ) ).
824
+ ELSE.
825
+ ro_xstring = NEW zrap_cl_xco_xstring( zrap_eml=>codepage_out( codepage = io_encoding->value source = value ) ).
826
+ ENDIF.
827
+ ENDMETHOD.
828
+
829
+ METHOD to_upper_case.
830
+ ro_string = NEW zrap_cl_xco_string( to_upper( value ) ).
831
+ ENDMETHOD.
832
+
833
+ METHOD to_lower_case.
834
+ ro_string = NEW zrap_cl_xco_string( to_lower( value ) ).
835
+ ENDMETHOD.
836
+
837
+ METHOD append.
838
+ ro_string = NEW zrap_cl_xco_string( value && iv_string ).
839
+ ENDMETHOD.
840
+
841
+ METHOD prepend.
842
+ ro_string = NEW zrap_cl_xco_string( iv_string && value ).
843
+ ENDMETHOD.
844
+
845
+ METHOD split.
846
+ DATA parts TYPE string_table.
847
+ DATA delimiter TYPE string.
848
+ delimiter = iv_delimiter.
849
+ SPLIT value AT delimiter INTO TABLE parts.
850
+ ro_strings = NEW zrap_cl_xco_strings( parts ).
851
+ ENDMETHOD.
852
+
853
+ METHOD starts_with.
854
+ DATA prefix TYPE string.
855
+ prefix = iv_value.
856
+ rv_starts_with = xsdbool( strlen( value ) >= strlen( prefix ) AND substring( val = value len = strlen( prefix ) ) = prefix ).
857
+ ENDMETHOD.
858
+
859
+ METHOD ends_with.
860
+ DATA suffix TYPE string.
861
+ suffix = iv_value.
862
+ rv_ends_with = xsdbool( strlen( value ) >= strlen( suffix ) AND substring( val = value off = strlen( value ) - strlen( suffix ) ) = suffix ).
863
+ ENDMETHOD.
864
+
865
+ METHOD get_length.
866
+ rv_length = strlen( value ).
867
+ ENDMETHOD.
868
+ ENDCLASS.
869
+ `;
870
+ const ZRAP_CL_XCO_STRINGS = `CLASS zrap_cl_xco_strings DEFINITION PUBLIC FINAL CREATE PUBLIC.
871
+ PUBLIC SECTION.
872
+ DATA value TYPE string_table READ-ONLY.
873
+ METHODS constructor IMPORTING value TYPE string_table.
874
+ METHODS join
875
+ IMPORTING iv_delimiter TYPE csequence DEFAULT \`\`
876
+ RETURNING VALUE(ro_string) TYPE REF TO zrap_cl_xco_string.
877
+ ENDCLASS.
878
+
879
+ CLASS zrap_cl_xco_strings IMPLEMENTATION.
880
+ METHOD constructor.
881
+ me->value = value.
882
+ ENDMETHOD.
883
+
884
+ METHOD join.
885
+ DATA delimiter TYPE string.
886
+ delimiter = iv_delimiter.
887
+ ro_string = NEW zrap_cl_xco_string( concat_lines_of( table = value sep = delimiter ) ).
888
+ ENDMETHOD.
889
+ ENDCLASS.
890
+ `;
891
+ const ZRAP_CL_XCO_XSTRING = `CLASS zrap_cl_xco_xstring DEFINITION PUBLIC FINAL CREATE PUBLIC.
892
+ PUBLIC SECTION.
893
+ DATA value TYPE xstring READ-ONLY.
894
+ METHODS constructor IMPORTING value TYPE xstring.
895
+ METHODS as_string
896
+ IMPORTING io_encoding TYPE REF TO zrap_cl_xco_encoding
897
+ RETURNING VALUE(ro_string) TYPE REF TO zrap_cl_xco_string.
898
+ ENDCLASS.
899
+
900
+ CLASS zrap_cl_xco_xstring IMPLEMENTATION.
901
+ METHOD constructor.
902
+ me->value = value.
903
+ ENDMETHOD.
904
+
905
+ METHOD as_string.
906
+ IF io_encoding->value = \`BASE64\`.
907
+ ro_string = NEW zrap_cl_xco_string( zrap_eml=>base64_encode_x( value ) ).
908
+ ELSE.
909
+ ro_string = NEW zrap_cl_xco_string( zrap_eml=>codepage_in( codepage = io_encoding->value source = value ) ).
910
+ ENDIF.
911
+ ENDMETHOD.
912
+ ENDCLASS.
913
+ `;
914
+ const ZRAP_CL_XCO_TIME_FORMAT = `CLASS zrap_cl_xco_time_format DEFINITION PUBLIC FINAL CREATE PUBLIC.
915
+ PUBLIC SECTION.
916
+ "! abap, iso_8601_basic or iso_8601_extended.
917
+ DATA value TYPE string READ-ONLY.
918
+ METHODS constructor IMPORTING value TYPE string.
919
+ ENDCLASS.
920
+
921
+ CLASS zrap_cl_xco_time_format IMPLEMENTATION.
922
+ METHOD constructor.
923
+ me->value = value.
924
+ ENDMETHOD.
925
+ ENDCLASS.
926
+ `;
927
+ const ZRAP_CL_XCO_TIME_FORMATS = `CLASS zrap_cl_xco_time_formats DEFINITION PUBLIC FINAL CREATE PUBLIC.
928
+ PUBLIC SECTION.
929
+ DATA abap TYPE REF TO zrap_cl_xco_time_format READ-ONLY.
930
+ DATA iso_8601_basic TYPE REF TO zrap_cl_xco_time_format READ-ONLY.
931
+ DATA iso_8601_extended TYPE REF TO zrap_cl_xco_time_format READ-ONLY.
932
+ METHODS constructor.
933
+ ENDCLASS.
934
+
935
+ CLASS zrap_cl_xco_time_formats IMPLEMENTATION.
936
+ METHOD constructor.
937
+ abap = NEW zrap_cl_xco_time_format( \`abap\` ).
938
+ iso_8601_basic = NEW zrap_cl_xco_time_format( \`iso_8601_basic\` ).
939
+ iso_8601_extended = NEW zrap_cl_xco_time_format( \`iso_8601_extended\` ).
940
+ ENDMETHOD.
941
+ ENDCLASS.
942
+ `;
943
+ const ZRAP_CL_XCO_TIME_ZONE = `CLASS zrap_cl_xco_time_zone DEFINITION PUBLIC FINAL CREATE PUBLIC.
944
+ PUBLIC SECTION.
945
+ "! The time zone: UTC (the applications run in UTC, the user time zone is UTC).
946
+ DATA value TYPE string READ-ONLY.
947
+ METHODS constructor IMPORTING value TYPE string.
948
+ ENDCLASS.
949
+
950
+ CLASS zrap_cl_xco_time_zone IMPLEMENTATION.
951
+ METHOD constructor.
952
+ me->value = value.
953
+ ENDMETHOD.
954
+ ENDCLASS.
955
+ `;
956
+ const ZRAP_CL_XCO_TIME_ZONES = `CLASS zrap_cl_xco_time_zones DEFINITION PUBLIC FINAL CREATE PUBLIC.
957
+ PUBLIC SECTION.
958
+ DATA user TYPE REF TO zrap_cl_xco_time_zone READ-ONLY.
959
+ DATA utc TYPE REF TO zrap_cl_xco_time_zone READ-ONLY.
960
+ METHODS constructor.
961
+ ENDCLASS.
962
+
963
+ CLASS zrap_cl_xco_time_zones IMPLEMENTATION.
964
+ METHOD constructor.
965
+ user = NEW zrap_cl_xco_time_zone( \`UTC\` ).
966
+ utc = NEW zrap_cl_xco_time_zone( \`UTC\` ).
967
+ ENDMETHOD.
968
+ ENDCLASS.
969
+ `;
970
+ const ZRAP_CL_XCO_DATE = `CLASS zrap_cl_xco_date DEFINITION PUBLIC FINAL CREATE PUBLIC.
971
+ PUBLIC SECTION.
972
+ DATA value TYPE d READ-ONLY.
973
+ DATA year TYPE n LENGTH 4 READ-ONLY.
974
+ DATA month TYPE n LENGTH 2 READ-ONLY.
975
+ DATA day TYPE n LENGTH 2 READ-ONLY.
976
+ METHODS constructor IMPORTING value TYPE d.
977
+ METHODS as
978
+ IMPORTING io_format TYPE REF TO zrap_cl_xco_time_format
979
+ RETURNING VALUE(ro_string) TYPE REF TO zrap_cl_xco_string.
980
+ METHODS add
981
+ IMPORTING iv_year TYPE i DEFAULT 0
982
+ iv_month TYPE i DEFAULT 0
983
+ iv_day TYPE i DEFAULT 0
984
+ RETURNING VALUE(ro_date) TYPE REF TO zrap_cl_xco_date.
985
+ METHODS subtract
986
+ IMPORTING iv_year TYPE i DEFAULT 0
987
+ iv_month TYPE i DEFAULT 0
988
+ iv_day TYPE i DEFAULT 0
989
+ RETURNING VALUE(ro_date) TYPE REF TO zrap_cl_xco_date.
990
+ ENDCLASS.
991
+
992
+ CLASS zrap_cl_xco_date IMPLEMENTATION.
993
+ METHOD constructor.
994
+ me->value = value.
995
+ year = value(4).
996
+ month = value+4(2).
997
+ day = value+6(2).
998
+ ENDMETHOD.
999
+
1000
+ METHOD as.
1001
+ CASE io_format->value.
1002
+ WHEN \`iso_8601_extended\`.
1003
+ ro_string = NEW zrap_cl_xco_string( |{ year }-{ month }-{ day }| ).
1004
+ WHEN OTHERS.
1005
+ ro_string = NEW zrap_cl_xco_string( |{ value }| ).
1006
+ ENDCASE.
1007
+ ENDMETHOD.
1008
+
1009
+ METHOD add.
1010
+ ro_date = NEW zrap_cl_xco_date( zrap_eml=>date_add( date = value years = iv_year months = iv_month days = iv_day ) ).
1011
+ ENDMETHOD.
1012
+
1013
+ METHOD subtract.
1014
+ ro_date = NEW zrap_cl_xco_date( zrap_eml=>date_add( date = value years = 0 - iv_year months = 0 - iv_month days = 0 - iv_day ) ).
1015
+ ENDMETHOD.
1016
+ ENDCLASS.
1017
+ `;
1018
+ const ZRAP_CL_XCO_TIME = `CLASS zrap_cl_xco_time DEFINITION PUBLIC FINAL CREATE PUBLIC.
1019
+ PUBLIC SECTION.
1020
+ DATA value TYPE t READ-ONLY.
1021
+ DATA hour TYPE n LENGTH 2 READ-ONLY.
1022
+ DATA minute TYPE n LENGTH 2 READ-ONLY.
1023
+ DATA second TYPE n LENGTH 2 READ-ONLY.
1024
+ METHODS constructor IMPORTING value TYPE t.
1025
+ METHODS as
1026
+ IMPORTING io_format TYPE REF TO zrap_cl_xco_time_format
1027
+ RETURNING VALUE(ro_string) TYPE REF TO zrap_cl_xco_string.
1028
+ METHODS add
1029
+ IMPORTING iv_hour TYPE i DEFAULT 0
1030
+ iv_minute TYPE i DEFAULT 0
1031
+ iv_second TYPE i DEFAULT 0
1032
+ RETURNING VALUE(ro_time) TYPE REF TO zrap_cl_xco_time.
1033
+ METHODS subtract
1034
+ IMPORTING iv_hour TYPE i DEFAULT 0
1035
+ iv_minute TYPE i DEFAULT 0
1036
+ iv_second TYPE i DEFAULT 0
1037
+ RETURNING VALUE(ro_time) TYPE REF TO zrap_cl_xco_time.
1038
+ ENDCLASS.
1039
+
1040
+ CLASS zrap_cl_xco_time IMPLEMENTATION.
1041
+ METHOD constructor.
1042
+ me->value = value.
1043
+ hour = value(2).
1044
+ minute = value+2(2).
1045
+ second = value+4(2).
1046
+ ENDMETHOD.
1047
+
1048
+ METHOD as.
1049
+ CASE io_format->value.
1050
+ WHEN \`iso_8601_extended\`.
1051
+ ro_string = NEW zrap_cl_xco_string( |{ hour }:{ minute }:{ second }| ).
1052
+ WHEN OTHERS.
1053
+ ro_string = NEW zrap_cl_xco_string( |{ value }| ).
1054
+ ENDCASE.
1055
+ ENDMETHOD.
1056
+
1057
+ METHOD add.
1058
+ DATA result TYPE t.
1059
+ result = value + iv_hour * 3600 + iv_minute * 60 + iv_second.
1060
+ ro_time = NEW zrap_cl_xco_time( result ).
1061
+ ENDMETHOD.
1062
+
1063
+ METHOD subtract.
1064
+ DATA result TYPE t.
1065
+ result = value - iv_hour * 3600 - iv_minute * 60 - iv_second.
1066
+ ro_time = NEW zrap_cl_xco_time( result ).
1067
+ ENDMETHOD.
1068
+ ENDCLASS.
1069
+ `;
1070
+ const ZRAP_CL_XCO_MOMENT = `CLASS zrap_cl_xco_moment DEFINITION PUBLIC FINAL CREATE PUBLIC.
1071
+ PUBLIC SECTION.
1072
+ "! The moment as a time stamp (UTC).
1073
+ DATA value TYPE timestamp READ-ONLY.
1074
+ DATA year TYPE n LENGTH 4 READ-ONLY.
1075
+ DATA month TYPE n LENGTH 2 READ-ONLY.
1076
+ DATA day TYPE n LENGTH 2 READ-ONLY.
1077
+ DATA hour TYPE n LENGTH 2 READ-ONLY.
1078
+ DATA minute TYPE n LENGTH 2 READ-ONLY.
1079
+ DATA second TYPE n LENGTH 2 READ-ONLY.
1080
+ METHODS constructor IMPORTING value TYPE timestamp.
1081
+ METHODS as
1082
+ IMPORTING io_format TYPE REF TO zrap_cl_xco_time_format
1083
+ RETURNING VALUE(ro_string) TYPE REF TO zrap_cl_xco_string.
1084
+ METHODS add
1085
+ IMPORTING iv_year TYPE i DEFAULT 0
1086
+ iv_month TYPE i DEFAULT 0
1087
+ iv_day TYPE i DEFAULT 0
1088
+ iv_hour TYPE i DEFAULT 0
1089
+ iv_minute TYPE i DEFAULT 0
1090
+ iv_second TYPE i DEFAULT 0
1091
+ RETURNING VALUE(ro_moment) TYPE REF TO zrap_cl_xco_moment.
1092
+ METHODS subtract
1093
+ IMPORTING iv_year TYPE i DEFAULT 0
1094
+ iv_month TYPE i DEFAULT 0
1095
+ iv_day TYPE i DEFAULT 0
1096
+ iv_hour TYPE i DEFAULT 0
1097
+ iv_minute TYPE i DEFAULT 0
1098
+ iv_second TYPE i DEFAULT 0
1099
+ RETURNING VALUE(ro_moment) TYPE REF TO zrap_cl_xco_moment.
1100
+ METHODS get_unix_timestamp RETURNING VALUE(ro_unix_timestamp) TYPE REF TO zrap_cl_xco_unix_timestamp.
1101
+ METHODS date RETURNING VALUE(ro_date) TYPE REF TO zrap_cl_xco_date.
1102
+ METHODS time RETURNING VALUE(ro_time) TYPE REF TO zrap_cl_xco_time.
1103
+ PRIVATE SECTION.
1104
+ DATA digits TYPE n LENGTH 14.
1105
+ ENDCLASS.
1106
+
1107
+ CLASS zrap_cl_xco_moment IMPLEMENTATION.
1108
+ METHOD constructor.
1109
+ me->value = value.
1110
+ digits = value.
1111
+ year = digits(4).
1112
+ month = digits+4(2).
1113
+ day = digits+6(2).
1114
+ hour = digits+8(2).
1115
+ minute = digits+10(2).
1116
+ second = digits+12(2).
1117
+ ENDMETHOD.
1118
+
1119
+ METHOD as.
1120
+ CASE io_format->value.
1121
+ WHEN \`iso_8601_extended\`.
1122
+ ro_string = NEW zrap_cl_xco_string( |{ year }-{ month }-{ day }T{ hour }:{ minute }:{ second }| ).
1123
+ WHEN \`iso_8601_basic\`.
1124
+ ro_string = NEW zrap_cl_xco_string( |{ year }{ month }{ day }T{ hour }{ minute }{ second }| ).
1125
+ WHEN OTHERS.
1126
+ ro_string = NEW zrap_cl_xco_string( |{ digits }| ).
1127
+ ENDCASE.
1128
+ ENDMETHOD.
1129
+
1130
+ METHOD add.
1131
+ ro_moment = NEW zrap_cl_xco_moment( zrap_eml=>moment_add( moment = value years = iv_year months = iv_month days = iv_day
1132
+ seconds = iv_hour * 3600 + iv_minute * 60 + iv_second ) ).
1133
+ ENDMETHOD.
1134
+
1135
+ METHOD subtract.
1136
+ ro_moment = NEW zrap_cl_xco_moment( zrap_eml=>moment_add( moment = value years = 0 - iv_year months = 0 - iv_month days = 0 - iv_day
1137
+ seconds = 0 - ( iv_hour * 3600 + iv_minute * 60 + iv_second ) ) ).
1138
+ ENDMETHOD.
1139
+
1140
+ METHOD get_unix_timestamp.
1141
+ ro_unix_timestamp = NEW zrap_cl_xco_unix_timestamp( zrap_eml=>unix_time( value ) ).
1142
+ ENDMETHOD.
1143
+
1144
+ METHOD date.
1145
+ DATA result TYPE d.
1146
+ result = digits(8).
1147
+ ro_date = NEW zrap_cl_xco_date( result ).
1148
+ ENDMETHOD.
1149
+
1150
+ METHOD time.
1151
+ DATA result TYPE t.
1152
+ result = digits+8(6).
1153
+ ro_time = NEW zrap_cl_xco_time( result ).
1154
+ ENDMETHOD.
1155
+ ENDCLASS.
1156
+ `;
1157
+ const ZRAP_CL_XCO_UNIX_TIMESTAMP = `CLASS zrap_cl_xco_unix_timestamp DEFINITION PUBLIC FINAL CREATE PUBLIC.
1158
+ PUBLIC SECTION.
1159
+ "! Seconds since 1970-01-01 00:00:00 UTC.
1160
+ DATA value TYPE int8 READ-ONLY.
1161
+ METHODS constructor IMPORTING value TYPE int8.
1162
+ ENDCLASS.
1163
+
1164
+ CLASS zrap_cl_xco_unix_timestamp IMPLEMENTATION.
1165
+ METHOD constructor.
1166
+ me->value = value.
1167
+ ENDMETHOD.
1168
+ ENDCLASS.
1169
+ `;
1170
+ const XCO_CP_TIME = `CLASS xco_cp_time DEFINITION PUBLIC FINAL CREATE PRIVATE.
1171
+ PUBLIC SECTION.
1172
+ CLASS-DATA format TYPE REF TO zrap_cl_xco_time_formats READ-ONLY.
1173
+ CLASS-DATA time_zone TYPE REF TO zrap_cl_xco_time_zones READ-ONLY.
1174
+ CLASS-METHODS class_constructor.
1175
+ CLASS-METHODS date
1176
+ IMPORTING iv_year TYPE csequence
1177
+ iv_month TYPE csequence
1178
+ iv_day TYPE csequence
1179
+ RETURNING VALUE(ro_date) TYPE REF TO zrap_cl_xco_date.
1180
+ CLASS-METHODS time
1181
+ IMPORTING iv_hour TYPE csequence
1182
+ iv_minute TYPE csequence
1183
+ iv_second TYPE csequence
1184
+ RETURNING VALUE(ro_time) TYPE REF TO zrap_cl_xco_time.
1185
+ CLASS-METHODS moment
1186
+ IMPORTING iv_year TYPE csequence
1187
+ iv_month TYPE csequence
1188
+ iv_day TYPE csequence
1189
+ iv_hour TYPE csequence
1190
+ iv_minute TYPE csequence
1191
+ iv_second TYPE csequence
1192
+ RETURNING VALUE(ro_moment) TYPE REF TO zrap_cl_xco_moment.
1193
+ ENDCLASS.
1194
+
1195
+ CLASS xco_cp_time IMPLEMENTATION.
1196
+ METHOD class_constructor.
1197
+ format = NEW zrap_cl_xco_time_formats( ).
1198
+ time_zone = NEW zrap_cl_xco_time_zones( ).
1199
+ ENDMETHOD.
1200
+
1201
+ METHOD date.
1202
+ DATA year TYPE n LENGTH 4.
1203
+ DATA month TYPE n LENGTH 2.
1204
+ DATA day TYPE n LENGTH 2.
1205
+ DATA value TYPE d.
1206
+ year = iv_year.
1207
+ month = iv_month.
1208
+ day = iv_day.
1209
+ value = |{ year }{ month }{ day }|.
1210
+ ro_date = NEW zrap_cl_xco_date( value ).
1211
+ ENDMETHOD.
1212
+
1213
+ METHOD time.
1214
+ DATA hour TYPE n LENGTH 2.
1215
+ DATA minute TYPE n LENGTH 2.
1216
+ DATA second TYPE n LENGTH 2.
1217
+ DATA value TYPE t.
1218
+ hour = iv_hour.
1219
+ minute = iv_minute.
1220
+ second = iv_second.
1221
+ value = |{ hour }{ minute }{ second }|.
1222
+ ro_time = NEW zrap_cl_xco_time( value ).
1223
+ ENDMETHOD.
1224
+
1225
+ METHOD moment.
1226
+ DATA year TYPE n LENGTH 4.
1227
+ DATA month TYPE n LENGTH 2.
1228
+ DATA day TYPE n LENGTH 2.
1229
+ DATA hour TYPE n LENGTH 2.
1230
+ DATA minute TYPE n LENGTH 2.
1231
+ DATA second TYPE n LENGTH 2.
1232
+ DATA digits TYPE n LENGTH 14.
1233
+ DATA value TYPE timestamp.
1234
+ year = iv_year.
1235
+ month = iv_month.
1236
+ day = iv_day.
1237
+ hour = iv_hour.
1238
+ minute = iv_minute.
1239
+ second = iv_second.
1240
+ digits = |{ year }{ month }{ day }{ hour }{ minute }{ second }|.
1241
+ value = digits.
1242
+ ro_moment = NEW zrap_cl_xco_moment( value ).
1243
+ ENDMETHOD.
1244
+ ENDCLASS.
1245
+ `;
1246
+ const ZRAP_CL_XCO_USER = `CLASS zrap_cl_xco_user DEFINITION PUBLIC FINAL CREATE PUBLIC.
1247
+ PUBLIC SECTION.
1248
+ DATA name TYPE syuname READ-ONLY.
1249
+ METHODS constructor IMPORTING name TYPE syuname.
1250
+ ENDCLASS.
1251
+
1252
+ CLASS zrap_cl_xco_user IMPLEMENTATION.
1253
+ METHOD constructor.
1254
+ me->name = name.
1255
+ ENDMETHOD.
1256
+ ENDCLASS.
1257
+ `;
1258
+ const ZRAP_CL_XCO_LANGUAGE = `CLASS zrap_cl_xco_language DEFINITION PUBLIC FINAL CREATE PUBLIC.
1259
+ PUBLIC SECTION.
1260
+ DATA value TYPE spras READ-ONLY.
1261
+ METHODS constructor IMPORTING value TYPE spras.
1262
+ ENDCLASS.
1263
+
1264
+ CLASS zrap_cl_xco_language IMPLEMENTATION.
1265
+ METHOD constructor.
1266
+ me->value = value.
1267
+ ENDMETHOD.
1268
+ ENDCLASS.
1269
+ `;
1270
+ const ZRAP_CL_XCO_SY = `CLASS zrap_cl_xco_sy DEFINITION PUBLIC FINAL CREATE PUBLIC.
1271
+ PUBLIC SECTION.
1272
+ METHODS user RETURNING VALUE(ro_user) TYPE REF TO zrap_cl_xco_user.
1273
+ METHODS language RETURNING VALUE(ro_language) TYPE REF TO zrap_cl_xco_language.
1274
+ METHODS date
1275
+ IMPORTING io_time_zone TYPE REF TO zrap_cl_xco_time_zone OPTIONAL
1276
+ RETURNING VALUE(ro_date) TYPE REF TO zrap_cl_xco_date.
1277
+ METHODS time
1278
+ IMPORTING io_time_zone TYPE REF TO zrap_cl_xco_time_zone OPTIONAL
1279
+ RETURNING VALUE(ro_time) TYPE REF TO zrap_cl_xco_time.
1280
+ METHODS moment
1281
+ IMPORTING io_time_zone TYPE REF TO zrap_cl_xco_time_zone OPTIONAL
1282
+ RETURNING VALUE(ro_moment) TYPE REF TO zrap_cl_xco_moment.
1283
+ METHODS unix_timestamp RETURNING VALUE(ro_unix_timestamp) TYPE REF TO zrap_cl_xco_unix_timestamp.
1284
+ ENDCLASS.
1285
+
1286
+ CLASS zrap_cl_xco_sy IMPLEMENTATION.
1287
+ METHOD user.
1288
+ ro_user = NEW zrap_cl_xco_user( sy-uname ).
1289
+ ENDMETHOD.
1290
+
1291
+ METHOD language.
1292
+ ro_language = NEW zrap_cl_xco_language( sy-langu ).
1293
+ ENDMETHOD.
1294
+
1295
+ METHOD date.
1296
+ ro_date = moment( )->date( ).
1297
+ ENDMETHOD.
1298
+
1299
+ METHOD time.
1300
+ ro_time = moment( )->time( ).
1301
+ ENDMETHOD.
1302
+
1303
+ METHOD moment.
1304
+ DATA now TYPE timestamp.
1305
+ GET TIME STAMP FIELD now.
1306
+ ro_moment = NEW zrap_cl_xco_moment( now ).
1307
+ ENDMETHOD.
1308
+
1309
+ METHOD unix_timestamp.
1310
+ ro_unix_timestamp = moment( )->get_unix_timestamp( ).
1311
+ ENDMETHOD.
1312
+ ENDCLASS.
1313
+ `;
1314
+ const XCO_CP = `CLASS xco_cp DEFINITION PUBLIC FINAL CREATE PRIVATE.
1315
+ PUBLIC SECTION.
1316
+ CLASS-DATA sy TYPE REF TO zrap_cl_xco_sy READ-ONLY.
1317
+ CLASS-METHODS class_constructor.
1318
+ CLASS-METHODS string
1319
+ IMPORTING iv_string TYPE csequence
1320
+ RETURNING VALUE(ro_string) TYPE REF TO zrap_cl_xco_string.
1321
+ CLASS-METHODS strings
1322
+ IMPORTING it_strings TYPE string_table
1323
+ RETURNING VALUE(ro_strings) TYPE REF TO zrap_cl_xco_strings.
1324
+ CLASS-METHODS xstring
1325
+ IMPORTING iv_xstring TYPE xsequence
1326
+ RETURNING VALUE(ro_xstring) TYPE REF TO zrap_cl_xco_xstring.
1327
+ ENDCLASS.
1328
+
1329
+ CLASS xco_cp IMPLEMENTATION.
1330
+ METHOD class_constructor.
1331
+ sy = NEW zrap_cl_xco_sy( ).
1332
+ ENDMETHOD.
1333
+
1334
+ METHOD string.
1335
+ ro_string = NEW zrap_cl_xco_string( |{ iv_string }| ).
1336
+ ENDMETHOD.
1337
+
1338
+ METHOD strings.
1339
+ ro_strings = NEW zrap_cl_xco_strings( it_strings ).
1340
+ ENDMETHOD.
1341
+
1342
+ METHOD xstring.
1343
+ DATA bytes TYPE xstring.
1344
+ bytes = iv_xstring.
1345
+ ro_xstring = NEW zrap_cl_xco_xstring( bytes ).
1346
+ ENDMETHOD.
1347
+ ENDCLASS.
1348
+ `;
1349
+ // ------------------------------------------------------------------------------ time stamps
1350
+ const CL_ABAP_TSTMP = `CLASS cl_abap_tstmp DEFINITION PUBLIC FINAL CREATE PRIVATE.
1351
+ PUBLIC SECTION.
1352
+ CLASS-METHODS add
1353
+ IMPORTING tstmp TYPE p
1354
+ secs TYPE numeric
1355
+ RETURNING VALUE(time) TYPE timestampl.
1356
+ CLASS-METHODS subtractsecs
1357
+ IMPORTING tstmp TYPE p
1358
+ secs TYPE numeric
1359
+ RETURNING VALUE(time) TYPE timestampl.
1360
+ CLASS-METHODS subtract
1361
+ IMPORTING tstmp1 TYPE p
1362
+ tstmp2 TYPE p
1363
+ RETURNING VALUE(r_secs) TYPE tzntstmpl.
1364
+ CLASS-METHODS compare
1365
+ IMPORTING tstmp1 TYPE p
1366
+ tstmp2 TYPE p
1367
+ RETURNING VALUE(comp) TYPE i.
1368
+ CLASS-METHODS move
1369
+ IMPORTING tstmp_src TYPE p
1370
+ EXPORTING tstmp_tgt TYPE p.
1371
+ CLASS-METHODS move_to_short
1372
+ IMPORTING tstmp_src TYPE timestampl
1373
+ RETURNING VALUE(tstmp_out) TYPE timestamp.
1374
+ CLASS-METHODS normalize
1375
+ IMPORTING tstmp_in TYPE p
1376
+ RETURNING VALUE(tstmp_out) TYPE timestampl.
1377
+ CLASS-METHODS tstmp2utclong
1378
+ IMPORTING timestamp TYPE p
1379
+ RETURNING VALUE(utclong) TYPE utclong.
1380
+ CLASS-METHODS utclong2tstmp
1381
+ IMPORTING utclong TYPE utclong
1382
+ RETURNING VALUE(timestamp) TYPE timestampl.
1383
+ CLASS-METHODS utclong2tstmp_short
1384
+ IMPORTING utclong TYPE utclong
1385
+ RETURNING VALUE(timestamp) TYPE timestamp.
1386
+ CLASS-METHODS systemtstmp_syst2utc
1387
+ IMPORTING syst_date TYPE d
1388
+ syst_time TYPE t
1389
+ EXPORTING utc_tstmp TYPE timestamp.
1390
+ CLASS-METHODS systemtstmp_utc2syst
1391
+ IMPORTING utc_tstmp TYPE timestamp
1392
+ EXPORTING syst_date TYPE d
1393
+ syst_time TYPE t.
1394
+ CLASS-METHODS td_add
1395
+ IMPORTING date TYPE d
1396
+ time TYPE t
1397
+ secs TYPE numeric
1398
+ EXPORTING res_date TYPE d
1399
+ res_time TYPE t.
1400
+ CLASS-METHODS td_subtract
1401
+ IMPORTING date1 TYPE d
1402
+ time1 TYPE t
1403
+ date2 TYPE d
1404
+ time2 TYPE t
1405
+ EXPORTING res_secs TYPE numeric.
1406
+ ENDCLASS.
1407
+
1408
+ CLASS cl_abap_tstmp IMPLEMENTATION.
1409
+ METHOD add.
1410
+ DATA seconds TYPE decfloat34.
1411
+ seconds = secs.
1412
+ time = zrap_eml=>tstmp_add( tstmp = |{ tstmp }| seconds = |{ seconds }| ).
1413
+ ENDMETHOD.
1414
+
1415
+ METHOD subtractsecs.
1416
+ DATA seconds TYPE decfloat34.
1417
+ seconds = 0 - secs.
1418
+ time = zrap_eml=>tstmp_add( tstmp = |{ tstmp }| seconds = |{ seconds }| ).
1419
+ ENDMETHOD.
1420
+
1421
+ METHOD subtract.
1422
+ r_secs = zrap_eml=>tstmp_diff( tstmp1 = |{ tstmp1 }| tstmp2 = |{ tstmp2 }| ).
1423
+ ENDMETHOD.
1424
+
1425
+ METHOD compare.
1426
+ DATA diff TYPE timestampl.
1427
+ diff = zrap_eml=>tstmp_diff( tstmp1 = |{ tstmp1 }| tstmp2 = |{ tstmp2 }| ).
1428
+ IF diff > 0.
1429
+ comp = 1.
1430
+ ELSEIF diff < 0.
1431
+ comp = -1.
1432
+ ELSE.
1433
+ comp = 0.
1434
+ ENDIF.
1435
+ ENDMETHOD.
1436
+
1437
+ METHOD move.
1438
+ tstmp_tgt = tstmp_src.
1439
+ ENDMETHOD.
1440
+
1441
+ METHOD move_to_short.
1442
+ tstmp_out = trunc( tstmp_src ).
1443
+ ENDMETHOD.
1444
+
1445
+ METHOD normalize.
1446
+ tstmp_out = zrap_eml=>tstmp_add( tstmp = |{ tstmp_in }| seconds = \`0\` ).
1447
+ ENDMETHOD.
1448
+
1449
+ METHOD tstmp2utclong.
1450
+ utclong = zrap_eml=>tstmp_to_utclong( |{ timestamp }| ).
1451
+ ENDMETHOD.
1452
+
1453
+ METHOD utclong2tstmp.
1454
+ timestamp = zrap_eml=>utclong_to_tstmp( utclong ).
1455
+ ENDMETHOD.
1456
+
1457
+ METHOD utclong2tstmp_short.
1458
+ timestamp = trunc( zrap_eml=>utclong_to_tstmp( utclong ) ).
1459
+ ENDMETHOD.
1460
+
1461
+ METHOD systemtstmp_syst2utc.
1462
+ utc_tstmp = |{ syst_date }{ syst_time }|.
1463
+ ENDMETHOD.
1464
+
1465
+ METHOD systemtstmp_utc2syst.
1466
+ DATA digits TYPE n LENGTH 14.
1467
+ digits = utc_tstmp.
1468
+ syst_date = digits(8).
1469
+ syst_time = digits+8(6).
1470
+ ENDMETHOD.
1471
+
1472
+ METHOD td_add.
1473
+ DATA start TYPE timestamp.
1474
+ DATA result TYPE timestamp.
1475
+ DATA digits TYPE n LENGTH 14.
1476
+ DATA seconds TYPE decfloat34.
1477
+ start = |{ date }{ time }|.
1478
+ seconds = secs.
1479
+ result = trunc( zrap_eml=>tstmp_add( tstmp = |{ start }| seconds = |{ seconds }| ) ).
1480
+ digits = result.
1481
+ res_date = digits(8).
1482
+ res_time = digits+8(6).
1483
+ ENDMETHOD.
1484
+
1485
+ METHOD td_subtract.
1486
+ DATA first TYPE timestamp.
1487
+ DATA second TYPE timestamp.
1488
+ first = |{ date1 }{ time1 }|.
1489
+ second = |{ date2 }{ time2 }|.
1490
+ res_secs = zrap_eml=>tstmp_diff( tstmp1 = |{ first }| tstmp2 = |{ second }| ).
1491
+ ENDMETHOD.
1492
+ ENDCLASS.
1493
+ `;
1494
+ const CL_ABAP_UTCLONG = `CLASS cl_abap_utclong DEFINITION PUBLIC FINAL CREATE PRIVATE.
1495
+ PUBLIC SECTION.
1496
+ CLASS-METHODS diff
1497
+ IMPORTING high TYPE utclong
1498
+ low TYPE utclong
1499
+ EXPORTING days TYPE i
1500
+ hours TYPE i
1501
+ minutes TYPE i
1502
+ seconds TYPE decfloat34.
1503
+ CLASS-METHODS read
1504
+ IMPORTING string TYPE csequence
1505
+ timezone TYPE csequence OPTIONAL
1506
+ EXPORTING value TYPE utclong
1507
+ RAISING cx_abap_utclong_invalid.
1508
+ ENDCLASS.
1509
+
1510
+ CLASS cl_abap_utclong IMPLEMENTATION.
1511
+ METHOD diff.
1512
+ DATA total TYPE decfloat34.
1513
+ DATA rest TYPE decfloat34.
1514
+ DATA sign TYPE i VALUE 1.
1515
+ total = utclong_diff( high = high low = low ).
1516
+ IF total < 0.
1517
+ sign = -1.
1518
+ total = 0 - total.
1519
+ ENDIF.
1520
+ days = trunc( total / 86400 ).
1521
+ rest = total - days * 86400.
1522
+ hours = trunc( rest / 3600 ).
1523
+ rest = rest - hours * 3600.
1524
+ minutes = trunc( rest / 60 ).
1525
+ seconds = rest - minutes * 60.
1526
+ days = days * sign.
1527
+ hours = hours * sign.
1528
+ minutes = minutes * sign.
1529
+ seconds = seconds * sign.
1530
+ ENDMETHOD.
1531
+
1532
+ METHOD read.
1533
+ value = zrap_eml=>utclong_read( |{ string }| ).
1534
+ ENDMETHOD.
1535
+ ENDCLASS.
1536
+ `;
1537
+ // ------------------------------------------------------------------------------ number ranges
1538
+ const CL_NUMBERRANGE_RUNTIME = `CLASS cl_numberrange_runtime DEFINITION PUBLIC FINAL CREATE PRIVATE.
1539
+ PUBLIC SECTION.
1540
+ TYPES nr_number TYPE n LENGTH 20.
1541
+ TYPES nr_interval TYPE c LENGTH 2.
1542
+ TYPES nr_object TYPE c LENGTH 10.
1543
+ TYPES nr_subobject TYPE c LENGTH 20.
1544
+ TYPES nr_toyear TYPE n LENGTH 4.
1545
+ TYPES nr_returncode TYPE c LENGTH 1.
1546
+ TYPES nr_quantity TYPE i.
1547
+ CLASS-METHODS number_get
1548
+ IMPORTING nr_range_nr TYPE nr_interval
1549
+ object TYPE nr_object
1550
+ quantity TYPE nr_quantity DEFAULT 1
1551
+ subobject TYPE nr_subobject OPTIONAL
1552
+ toyear TYPE nr_toyear OPTIONAL
1553
+ ignore_buffer TYPE abap_bool OPTIONAL
1554
+ EXPORTING number TYPE nr_number
1555
+ returncode TYPE nr_returncode
1556
+ returned_quantity TYPE nr_quantity
1557
+ RAISING cx_nr_object_not_found
1558
+ cx_number_ranges.
1559
+ CLASS-METHODS number_check
1560
+ IMPORTING nr_range_nr TYPE nr_interval
1561
+ object TYPE nr_object
1562
+ number TYPE nr_number
1563
+ subobject TYPE nr_subobject OPTIONAL
1564
+ toyear TYPE nr_toyear OPTIONAL
1565
+ EXPORTING returncode TYPE nr_returncode
1566
+ RAISING cx_nr_object_not_found
1567
+ cx_number_ranges.
1568
+ ENDCLASS.
1569
+
1570
+ CLASS cl_numberrange_runtime IMPLEMENTATION.
1571
+ METHOD number_get.
1572
+ DATA text TYPE string.
1573
+ zrap_eml=>number_get( EXPORTING object = |{ object }|
1574
+ subobject = |{ subobject }|
1575
+ interval = |{ nr_range_nr }|
1576
+ toyear = |{ toyear }|
1577
+ quantity = quantity
1578
+ IMPORTING number = text
1579
+ returncode = returncode
1580
+ returned = returned_quantity ).
1581
+ number = text.
1582
+ ENDMETHOD.
1583
+
1584
+ METHOD number_check.
1585
+ zrap_eml=>number_check( EXPORTING object = |{ object }|
1586
+ subobject = |{ subobject }|
1587
+ interval = |{ nr_range_nr }|
1588
+ toyear = |{ toyear }|
1589
+ number = |{ number }|
1590
+ IMPORTING returncode = returncode ).
1591
+ ENDMETHOD.
1592
+ ENDCLASS.
1593
+ `;
1594
+ // ------------------------------------------------------------------------------ application log
1595
+ const IF_BALI_CONSTANTS = `INTERFACE if_bali_constants PUBLIC.
1596
+ TYPES ty_severity TYPE c LENGTH 1.
1597
+ TYPES ty_category TYPE c LENGTH 1.
1598
+ CONSTANTS c_severity_error TYPE ty_severity VALUE 'E'.
1599
+ CONSTANTS c_severity_warning TYPE ty_severity VALUE 'W'.
1600
+ CONSTANTS c_severity_information TYPE ty_severity VALUE 'I'.
1601
+ CONSTANTS c_severity_status TYPE ty_severity VALUE 'S'.
1602
+ CONSTANTS c_severity_abort TYPE ty_severity VALUE 'A'.
1603
+ CONSTANTS c_severity_exit TYPE ty_severity VALUE 'X'.
1604
+ CONSTANTS c_category_message TYPE ty_category VALUE 'M'.
1605
+ CONSTANTS c_category_free_text TYPE ty_category VALUE 'F'.
1606
+ CONSTANTS c_category_exception TYPE ty_category VALUE 'X'.
1607
+ ENDINTERFACE.
1608
+ `;
1609
+ const IF_BALI_ITEM_GETTER = `INTERFACE if_bali_item_getter PUBLIC.
1610
+ DATA severity TYPE if_bali_constants=>ty_severity READ-ONLY.
1611
+ DATA category TYPE if_bali_constants=>ty_category READ-ONLY.
1612
+ DATA timestamp TYPE timestampl READ-ONLY.
1613
+ DATA message_id TYPE symsgid READ-ONLY.
1614
+ DATA message_number TYPE symsgno READ-ONLY.
1615
+ DATA variable_1 TYPE symsgv READ-ONLY.
1616
+ DATA variable_2 TYPE symsgv READ-ONLY.
1617
+ DATA variable_3 TYPE symsgv READ-ONLY.
1618
+ DATA variable_4 TYPE symsgv READ-ONLY.
1619
+ METHODS get_message_text RETURNING VALUE(message_text) TYPE string.
1620
+ ENDINTERFACE.
1621
+ `;
1622
+ const IF_BALI_ITEM_SETTER = `INTERFACE if_bali_item_setter PUBLIC.
1623
+ INTERFACES if_bali_item_getter.
1624
+ ENDINTERFACE.
1625
+ `;
1626
+ const ZRAP_CL_BALI_ITEM = `CLASS zrap_cl_bali_item DEFINITION PUBLIC CREATE PUBLIC.
1627
+ PUBLIC SECTION.
1628
+ INTERFACES if_bali_item_setter.
1629
+ METHODS constructor
1630
+ IMPORTING severity TYPE if_bali_constants=>ty_severity
1631
+ category TYPE if_bali_constants=>ty_category
1632
+ text TYPE string OPTIONAL
1633
+ id TYPE symsgid OPTIONAL
1634
+ number TYPE symsgno OPTIONAL
1635
+ v1 TYPE symsgv OPTIONAL
1636
+ v2 TYPE symsgv OPTIONAL
1637
+ v3 TYPE symsgv OPTIONAL
1638
+ v4 TYPE symsgv OPTIONAL
1639
+ timestamp TYPE timestampl OPTIONAL.
1640
+ DATA text TYPE string READ-ONLY.
1641
+ ENDCLASS.
1642
+
1643
+ CLASS zrap_cl_bali_item IMPLEMENTATION.
1644
+ METHOD constructor.
1645
+ if_bali_item_getter~severity = severity.
1646
+ if_bali_item_getter~category = category.
1647
+ if_bali_item_getter~message_id = id.
1648
+ if_bali_item_getter~message_number = number.
1649
+ if_bali_item_getter~variable_1 = v1.
1650
+ if_bali_item_getter~variable_2 = v2.
1651
+ if_bali_item_getter~variable_3 = v3.
1652
+ if_bali_item_getter~variable_4 = v4.
1653
+ if_bali_item_getter~timestamp = timestamp.
1654
+ IF timestamp IS INITIAL.
1655
+ GET TIME STAMP FIELD if_bali_item_getter~timestamp.
1656
+ ENDIF.
1657
+ me->text = text.
1658
+ ENDMETHOD.
1659
+
1660
+ METHOD if_bali_item_getter~get_message_text.
1661
+ IF text IS NOT INITIAL OR if_bali_item_getter~message_id IS INITIAL.
1662
+ message_text = text.
1663
+ RETURN.
1664
+ ENDIF.
1665
+ message_text = zrap_eml=>message_text( id = |{ if_bali_item_getter~message_id }|
1666
+ number = |{ if_bali_item_getter~message_number }|
1667
+ v1 = |{ if_bali_item_getter~variable_1 }|
1668
+ v2 = |{ if_bali_item_getter~variable_2 }|
1669
+ v3 = |{ if_bali_item_getter~variable_3 }|
1670
+ v4 = |{ if_bali_item_getter~variable_4 }| ).
1671
+ ENDMETHOD.
1672
+ ENDCLASS.
1673
+ `;
1674
+ const CL_BALI_FREE_TEXT_SETTER = `CLASS cl_bali_free_text_setter DEFINITION PUBLIC FINAL CREATE PRIVATE.
1675
+ PUBLIC SECTION.
1676
+ CLASS-METHODS create
1677
+ IMPORTING severity TYPE if_bali_constants=>ty_severity DEFAULT if_bali_constants=>c_severity_status
1678
+ text TYPE csequence
1679
+ RETURNING VALUE(free_text) TYPE REF TO if_bali_item_setter.
1680
+ ENDCLASS.
1681
+
1682
+ CLASS cl_bali_free_text_setter IMPLEMENTATION.
1683
+ METHOD create.
1684
+ free_text = NEW zrap_cl_bali_item( severity = severity category = if_bali_constants=>c_category_free_text text = |{ text }| ).
1685
+ ENDMETHOD.
1686
+ ENDCLASS.
1687
+ `;
1688
+ const CL_BALI_MESSAGE_SETTER = `CLASS cl_bali_message_setter DEFINITION PUBLIC FINAL CREATE PRIVATE.
1689
+ PUBLIC SECTION.
1690
+ CLASS-METHODS create
1691
+ IMPORTING severity TYPE if_bali_constants=>ty_severity DEFAULT if_bali_constants=>c_severity_status
1692
+ id TYPE symsgid
1693
+ number TYPE symsgno
1694
+ variable_1 TYPE simple OPTIONAL
1695
+ variable_2 TYPE simple OPTIONAL
1696
+ variable_3 TYPE simple OPTIONAL
1697
+ variable_4 TYPE simple OPTIONAL
1698
+ RETURNING VALUE(message) TYPE REF TO if_bali_item_setter.
1699
+ CLASS-METHODS create_from_sy
1700
+ RETURNING VALUE(message) TYPE REF TO if_bali_item_setter.
1701
+ CLASS-METHODS create_from_bapiret2
1702
+ IMPORTING message_data TYPE any
1703
+ RETURNING VALUE(message) TYPE REF TO if_bali_item_setter.
1704
+ ENDCLASS.
1705
+
1706
+ CLASS cl_bali_message_setter IMPLEMENTATION.
1707
+ METHOD create.
1708
+ message = NEW zrap_cl_bali_item( severity = severity
1709
+ category = if_bali_constants=>c_category_message
1710
+ id = id
1711
+ number = number
1712
+ v1 = |{ variable_1 }|
1713
+ v2 = |{ variable_2 }|
1714
+ v3 = |{ variable_3 }|
1715
+ v4 = |{ variable_4 }| ).
1716
+ ENDMETHOD.
1717
+
1718
+ METHOD create_from_sy.
1719
+ message = NEW zrap_cl_bali_item( severity = sy-msgty
1720
+ category = if_bali_constants=>c_category_message
1721
+ id = sy-msgid
1722
+ number = sy-msgno
1723
+ v1 = sy-msgv1
1724
+ v2 = sy-msgv2
1725
+ v3 = sy-msgv3
1726
+ v4 = sy-msgv4 ).
1727
+ ENDMETHOD.
1728
+
1729
+ METHOD create_from_bapiret2.
1730
+ FIELD-SYMBOLS <value> TYPE any.
1731
+ DATA severity TYPE if_bali_constants=>ty_severity.
1732
+ DATA id TYPE symsgid.
1733
+ DATA number TYPE symsgno.
1734
+ DATA v TYPE STANDARD TABLE OF symsgv WITH EMPTY KEY.
1735
+ ASSIGN COMPONENT \`TYPE\` OF STRUCTURE message_data TO <value>.
1736
+ IF sy-subrc = 0.
1737
+ severity = <value>.
1738
+ ENDIF.
1739
+ ASSIGN COMPONENT \`ID\` OF STRUCTURE message_data TO <value>.
1740
+ IF sy-subrc = 0.
1741
+ id = <value>.
1742
+ ENDIF.
1743
+ ASSIGN COMPONENT \`NUMBER\` OF STRUCTURE message_data TO <value>.
1744
+ IF sy-subrc = 0.
1745
+ number = <value>.
1746
+ ENDIF.
1747
+ DO 4 TIMES.
1748
+ ASSIGN COMPONENT |MESSAGE_V{ sy-index }| OF STRUCTURE message_data TO <value>.
1749
+ IF sy-subrc = 0.
1750
+ APPEND <value> TO v.
1751
+ ELSE.
1752
+ APPEND INITIAL LINE TO v.
1753
+ ENDIF.
1754
+ ENDDO.
1755
+ message = NEW zrap_cl_bali_item( severity = severity
1756
+ category = if_bali_constants=>c_category_message
1757
+ id = id
1758
+ number = number
1759
+ v1 = v[ 1 ]
1760
+ v2 = v[ 2 ]
1761
+ v3 = v[ 3 ]
1762
+ v4 = v[ 4 ] ).
1763
+ ENDMETHOD.
1764
+ ENDCLASS.
1765
+ `;
1766
+ const CL_BALI_EXCEPTION_SETTER = `CLASS cl_bali_exception_setter DEFINITION PUBLIC FINAL CREATE PRIVATE.
1767
+ PUBLIC SECTION.
1768
+ CLASS-METHODS create
1769
+ IMPORTING severity TYPE if_bali_constants=>ty_severity DEFAULT if_bali_constants=>c_severity_error
1770
+ exception TYPE REF TO cx_root
1771
+ RETURNING VALUE(exception_item) TYPE REF TO if_bali_item_setter.
1772
+ ENDCLASS.
1773
+
1774
+ CLASS cl_bali_exception_setter IMPLEMENTATION.
1775
+ METHOD create.
1776
+ exception_item = NEW zrap_cl_bali_item( severity = severity category = if_bali_constants=>c_category_exception text = exception->get_text( ) ).
1777
+ ENDMETHOD.
1778
+ ENDCLASS.
1779
+ `;
1780
+ const IF_BALI_HEADER_GETTER = `INTERFACE if_bali_header_getter PUBLIC.
1781
+ TYPES ty_object TYPE c LENGTH 20.
1782
+ TYPES ty_subobject TYPE c LENGTH 20.
1783
+ TYPES ty_external_id TYPE c LENGTH 100.
1784
+ DATA object TYPE ty_object READ-ONLY.
1785
+ DATA subobject TYPE ty_subobject READ-ONLY.
1786
+ DATA external_id TYPE ty_external_id READ-ONLY.
1787
+ DATA expiry_date TYPE d READ-ONLY.
1788
+ DATA keep_until_expiry TYPE abap_bool READ-ONLY.
1789
+ DATA log_user TYPE syuname READ-ONLY.
1790
+ DATA log_timestamp TYPE timestampl READ-ONLY.
1791
+ ENDINTERFACE.
1792
+ `;
1793
+ const IF_BALI_HEADER_SETTER = `INTERFACE if_bali_header_setter PUBLIC.
1794
+ INTERFACES if_bali_header_getter.
1795
+ METHODS set_expiry
1796
+ IMPORTING expiry_date TYPE d
1797
+ keep_until_expiry TYPE abap_bool DEFAULT abap_false
1798
+ RETURNING VALUE(header) TYPE REF TO if_bali_header_setter.
1799
+ METHODS set_descriptor
1800
+ IMPORTING object TYPE if_bali_header_getter=>ty_object
1801
+ subobject TYPE if_bali_header_getter=>ty_subobject OPTIONAL
1802
+ external_id TYPE if_bali_header_getter=>ty_external_id OPTIONAL
1803
+ RETURNING VALUE(header) TYPE REF TO if_bali_header_setter.
1804
+ ENDINTERFACE.
1805
+ `;
1806
+ const CL_BALI_HEADER_SETTER = `CLASS cl_bali_header_setter DEFINITION PUBLIC FINAL CREATE PUBLIC.
1807
+ PUBLIC SECTION.
1808
+ INTERFACES if_bali_header_setter.
1809
+ TYPES ty_object TYPE if_bali_header_getter=>ty_object.
1810
+ TYPES ty_subobject TYPE if_bali_header_getter=>ty_subobject.
1811
+ TYPES ty_external_id TYPE if_bali_header_getter=>ty_external_id.
1812
+ CLASS-METHODS create
1813
+ IMPORTING object TYPE ty_object
1814
+ subobject TYPE ty_subobject OPTIONAL
1815
+ external_id TYPE ty_external_id OPTIONAL
1816
+ RETURNING VALUE(header) TYPE REF TO if_bali_header_setter.
1817
+ METHODS zrap_set_creation
1818
+ IMPORTING log_user TYPE syuname
1819
+ log_timestamp TYPE timestampl.
1820
+ ENDCLASS.
1821
+
1822
+ CLASS cl_bali_header_setter IMPLEMENTATION.
1823
+ METHOD create.
1824
+ DATA setter TYPE REF TO cl_bali_header_setter.
1825
+ setter = NEW cl_bali_header_setter( ).
1826
+ setter->if_bali_header_setter~set_descriptor( object = object subobject = subobject external_id = external_id ).
1827
+ header = setter.
1828
+ ENDMETHOD.
1829
+
1830
+ METHOD if_bali_header_setter~set_expiry.
1831
+ if_bali_header_getter~expiry_date = expiry_date.
1832
+ if_bali_header_getter~keep_until_expiry = keep_until_expiry.
1833
+ header = me.
1834
+ ENDMETHOD.
1835
+
1836
+ METHOD if_bali_header_setter~set_descriptor.
1837
+ if_bali_header_getter~object = object.
1838
+ if_bali_header_getter~subobject = subobject.
1839
+ if_bali_header_getter~external_id = external_id.
1840
+ header = me.
1841
+ ENDMETHOD.
1842
+
1843
+ METHOD zrap_set_creation.
1844
+ if_bali_header_getter~log_user = log_user.
1845
+ if_bali_header_getter~log_timestamp = log_timestamp.
1846
+ ENDMETHOD.
1847
+ ENDCLASS.
1848
+ `;
1849
+ const IF_BALI_LOG = `INTERFACE if_bali_log PUBLIC.
1850
+ TYPES ty_handle TYPE c LENGTH 22.
1851
+ TYPES: BEGIN OF ty_item_entry,
1852
+ log_item_number TYPE i,
1853
+ item TYPE REF TO if_bali_item_getter,
1854
+ END OF ty_item_entry.
1855
+ TYPES ty_item_table TYPE STANDARD TABLE OF ty_item_entry WITH EMPTY KEY.
1856
+ METHODS set_header
1857
+ IMPORTING header TYPE REF TO if_bali_header_setter
1858
+ RAISING cx_bali_runtime.
1859
+ METHODS get_header
1860
+ RETURNING VALUE(header) TYPE REF TO if_bali_header_getter
1861
+ RAISING cx_bali_runtime.
1862
+ METHODS add_item
1863
+ IMPORTING item TYPE REF TO if_bali_item_setter
1864
+ RAISING cx_bali_runtime.
1865
+ METHODS add_all_items_from_other_log
1866
+ IMPORTING source_log TYPE REF TO if_bali_log
1867
+ RAISING cx_bali_runtime.
1868
+ METHODS get_all_items
1869
+ RETURNING VALUE(item_table) TYPE ty_item_table
1870
+ RAISING cx_bali_runtime.
1871
+ METHODS get_handle
1872
+ RETURNING VALUE(handle) TYPE ty_handle
1873
+ RAISING cx_bali_runtime.
1874
+ METHODS release_memory.
1875
+ ENDINTERFACE.
1876
+ `;
1877
+ const CL_BALI_LOG = `CLASS cl_bali_log DEFINITION PUBLIC FINAL CREATE PUBLIC.
1878
+ PUBLIC SECTION.
1879
+ INTERFACES if_bali_log.
1880
+ CLASS-METHODS create
1881
+ RETURNING VALUE(log) TYPE REF TO if_bali_log
1882
+ RAISING cx_bali_runtime.
1883
+ CLASS-METHODS create_with_header
1884
+ IMPORTING header TYPE REF TO if_bali_header_setter
1885
+ RETURNING VALUE(log) TYPE REF TO if_bali_log
1886
+ RAISING cx_bali_runtime.
1887
+ METHODS constructor
1888
+ IMPORTING handle TYPE if_bali_log=>ty_handle OPTIONAL.
1889
+ "! Items of the log, as the kernel saves them (zrap_eml=>bali_save).
1890
+ TYPES: BEGIN OF zrap_ty_item,
1891
+ severity TYPE c LENGTH 1,
1892
+ category TYPE c LENGTH 1,
1893
+ text TYPE string,
1894
+ id TYPE string,
1895
+ number TYPE string,
1896
+ v1 TYPE string,
1897
+ v2 TYPE string,
1898
+ v3 TYPE string,
1899
+ v4 TYPE string,
1900
+ timestamp TYPE timestampl,
1901
+ END OF zrap_ty_item.
1902
+ TYPES zrap_tt_item TYPE STANDARD TABLE OF zrap_ty_item WITH EMPTY KEY.
1903
+ METHODS zrap_items RETURNING VALUE(result) TYPE zrap_tt_item.
1904
+ METHODS zrap_add
1905
+ IMPORTING item TYPE zrap_ty_item.
1906
+ PRIVATE SECTION.
1907
+ DATA handle TYPE if_bali_log=>ty_handle.
1908
+ DATA header TYPE REF TO if_bali_header_setter.
1909
+ DATA items TYPE if_bali_log=>ty_item_table.
1910
+ ENDCLASS.
1911
+
1912
+ CLASS cl_bali_log IMPLEMENTATION.
1913
+ METHOD create.
1914
+ log = NEW cl_bali_log( ).
1915
+ ENDMETHOD.
1916
+
1917
+ METHOD create_with_header.
1918
+ log = NEW cl_bali_log( ).
1919
+ log->set_header( header ).
1920
+ ENDMETHOD.
1921
+
1922
+ METHOD constructor.
1923
+ DATA uuid TYPE sysuuid_c32.
1924
+ IF handle IS INITIAL.
1925
+ uuid = cl_system_uuid=>create_uuid_c32_static( ).
1926
+ me->handle = uuid(22).
1927
+ ELSE.
1928
+ me->handle = handle.
1929
+ ENDIF.
1930
+ ENDMETHOD.
1931
+
1932
+ METHOD if_bali_log~set_header.
1933
+ me->header = header.
1934
+ ENDMETHOD.
1935
+
1936
+ METHOD if_bali_log~get_header.
1937
+ IF me->header IS INITIAL.
1938
+ RAISE EXCEPTION NEW cx_bali_not_possible( zrap_text = \`the log has no header\` ).
1939
+ ENDIF.
1940
+ header = me->header.
1941
+ ENDMETHOD.
1942
+
1943
+ METHOD if_bali_log~add_item.
1944
+ APPEND VALUE #( log_item_number = lines( items ) + 1 item = item ) TO items.
1945
+ ENDMETHOD.
1946
+
1947
+ METHOD if_bali_log~add_all_items_from_other_log.
1948
+ DATA entry TYPE if_bali_log=>ty_item_entry.
1949
+ LOOP AT source_log->get_all_items( ) INTO entry.
1950
+ APPEND VALUE #( log_item_number = lines( items ) + 1 item = entry-item ) TO items.
1951
+ ENDLOOP.
1952
+ ENDMETHOD.
1953
+
1954
+ METHOD if_bali_log~get_all_items.
1955
+ item_table = items.
1956
+ ENDMETHOD.
1957
+
1958
+ METHOD if_bali_log~get_handle.
1959
+ handle = me->handle.
1960
+ ENDMETHOD.
1961
+
1962
+ METHOD if_bali_log~release_memory.
1963
+ CLEAR items.
1964
+ ENDMETHOD.
1965
+
1966
+ METHOD zrap_items.
1967
+ DATA entry TYPE if_bali_log=>ty_item_entry.
1968
+ DATA item TYPE zrap_ty_item.
1969
+ DATA text TYPE string.
1970
+ LOOP AT me->items INTO entry.
1971
+ CLEAR item.
1972
+ item-severity = entry-item->severity.
1973
+ item-category = entry-item->category.
1974
+ item-timestamp = entry-item->timestamp.
1975
+ item-id = entry-item->message_id.
1976
+ item-number = entry-item->message_number.
1977
+ item-v1 = entry-item->variable_1.
1978
+ item-v2 = entry-item->variable_2.
1979
+ item-v3 = entry-item->variable_3.
1980
+ item-v4 = entry-item->variable_4.
1981
+ item-text = entry-item->get_message_text( ).
1982
+ APPEND item TO result.
1983
+ ENDLOOP.
1984
+ ENDMETHOD.
1985
+
1986
+ METHOD zrap_add.
1987
+ DATA id TYPE symsgid.
1988
+ DATA number TYPE symsgno.
1989
+ id = item-id.
1990
+ number = item-number.
1991
+ APPEND VALUE #( log_item_number = lines( items ) + 1
1992
+ item = NEW zrap_cl_bali_item( severity = item-severity
1993
+ category = item-category
1994
+ text = item-text
1995
+ id = id
1996
+ number = number
1997
+ v1 = |{ item-v1 }|
1998
+ v2 = |{ item-v2 }|
1999
+ v3 = |{ item-v3 }|
2000
+ v4 = |{ item-v4 }|
2001
+ timestamp = item-timestamp ) ) TO me->items.
2002
+ ENDMETHOD.
2003
+ ENDCLASS.
2004
+ `;
2005
+ const IF_BALI_LOG_FILTER = `INTERFACE if_bali_log_filter PUBLIC.
2006
+ METHODS set_descriptor
2007
+ IMPORTING object TYPE if_bali_header_getter=>ty_object OPTIONAL
2008
+ subobject TYPE if_bali_header_getter=>ty_subobject OPTIONAL
2009
+ external_id TYPE if_bali_header_getter=>ty_external_id OPTIONAL
2010
+ RETURNING VALUE(filter) TYPE REF TO if_bali_log_filter.
2011
+ METHODS set_create_info
2012
+ IMPORTING user TYPE syuname OPTIONAL
2013
+ RETURNING VALUE(filter) TYPE REF TO if_bali_log_filter.
2014
+ METHODS set_time_interval
2015
+ IMPORTING start_time TYPE utclong OPTIONAL
2016
+ end_time TYPE utclong OPTIONAL
2017
+ RETURNING VALUE(filter) TYPE REF TO if_bali_log_filter.
2018
+ METHODS set_maximum_log_number
2019
+ IMPORTING max_log_number TYPE i
2020
+ RETURNING VALUE(filter) TYPE REF TO if_bali_log_filter.
2021
+ DATA object TYPE if_bali_header_getter=>ty_object READ-ONLY.
2022
+ DATA subobject TYPE if_bali_header_getter=>ty_subobject READ-ONLY.
2023
+ DATA external_id TYPE if_bali_header_getter=>ty_external_id READ-ONLY.
2024
+ DATA user TYPE syuname READ-ONLY.
2025
+ DATA start_time TYPE utclong READ-ONLY.
2026
+ DATA end_time TYPE utclong READ-ONLY.
2027
+ DATA max_log_number TYPE i READ-ONLY.
2028
+ ENDINTERFACE.
2029
+ `;
2030
+ const CL_BALI_LOG_FILTER = `CLASS cl_bali_log_filter DEFINITION PUBLIC FINAL CREATE PUBLIC.
2031
+ PUBLIC SECTION.
2032
+ INTERFACES if_bali_log_filter.
2033
+ CLASS-METHODS create RETURNING VALUE(filter) TYPE REF TO if_bali_log_filter.
2034
+ ENDCLASS.
2035
+
2036
+ CLASS cl_bali_log_filter IMPLEMENTATION.
2037
+ METHOD create.
2038
+ filter = NEW cl_bali_log_filter( ).
2039
+ ENDMETHOD.
2040
+
2041
+ METHOD if_bali_log_filter~set_descriptor.
2042
+ if_bali_log_filter~object = object.
2043
+ if_bali_log_filter~subobject = subobject.
2044
+ if_bali_log_filter~external_id = external_id.
2045
+ filter = me.
2046
+ ENDMETHOD.
2047
+
2048
+ METHOD if_bali_log_filter~set_create_info.
2049
+ if_bali_log_filter~user = user.
2050
+ filter = me.
2051
+ ENDMETHOD.
2052
+
2053
+ METHOD if_bali_log_filter~set_time_interval.
2054
+ if_bali_log_filter~start_time = start_time.
2055
+ if_bali_log_filter~end_time = end_time.
2056
+ filter = me.
2057
+ ENDMETHOD.
2058
+
2059
+ METHOD if_bali_log_filter~set_maximum_log_number.
2060
+ if_bali_log_filter~max_log_number = max_log_number.
2061
+ filter = me.
2062
+ ENDMETHOD.
2063
+ ENDCLASS.
2064
+ `;
2065
+ const IF_BALI_LOG_DB = `INTERFACE if_bali_log_db PUBLIC.
2066
+ TYPES ty_log_table TYPE STANDARD TABLE OF REF TO if_bali_log WITH EMPTY KEY.
2067
+ METHODS save_log
2068
+ IMPORTING log TYPE REF TO if_bali_log
2069
+ use_2nd_db_connection TYPE abap_bool DEFAULT abap_false
2070
+ assign_to_current_appl_job TYPE abap_bool DEFAULT abap_false
2071
+ RAISING cx_bali_runtime.
2072
+ METHODS load_log
2073
+ IMPORTING handle TYPE if_bali_log=>ty_handle
2074
+ read_only_flag TYPE abap_bool DEFAULT abap_true
2075
+ RETURNING VALUE(log) TYPE REF TO if_bali_log
2076
+ RAISING cx_bali_runtime.
2077
+ METHODS load_logs_via_filter
2078
+ IMPORTING filter TYPE REF TO if_bali_log_filter
2079
+ RETURNING VALUE(log_table) TYPE ty_log_table
2080
+ RAISING cx_bali_runtime.
2081
+ METHODS load_logs_w_items_via_filter
2082
+ IMPORTING filter TYPE REF TO if_bali_log_filter
2083
+ RETURNING VALUE(log_table) TYPE ty_log_table
2084
+ RAISING cx_bali_runtime.
2085
+ METHODS delete_log
2086
+ IMPORTING log TYPE REF TO if_bali_log
2087
+ RAISING cx_bali_runtime.
2088
+ ENDINTERFACE.
2089
+ `;
2090
+ const CL_BALI_LOG_DB = `CLASS cl_bali_log_db DEFINITION PUBLIC FINAL CREATE PRIVATE.
2091
+ PUBLIC SECTION.
2092
+ INTERFACES if_bali_log_db.
2093
+ CLASS-METHODS get_instance
2094
+ RETURNING VALUE(log_db) TYPE REF TO if_bali_log_db
2095
+ RAISING cx_bali_runtime.
2096
+ PRIVATE SECTION.
2097
+ CLASS-DATA instance TYPE REF TO cl_bali_log_db.
2098
+ METHODS load
2099
+ IMPORTING filter TYPE REF TO if_bali_log_filter OPTIONAL
2100
+ handle TYPE if_bali_log=>ty_handle OPTIONAL
2101
+ RETURNING VALUE(log_table) TYPE if_bali_log_db=>ty_log_table.
2102
+ ENDCLASS.
2103
+
2104
+ CLASS cl_bali_log_db IMPLEMENTATION.
2105
+ METHOD get_instance.
2106
+ IF instance IS INITIAL.
2107
+ instance = NEW cl_bali_log_db( ).
2108
+ ENDIF.
2109
+ log_db = instance.
2110
+ ENDMETHOD.
2111
+
2112
+ METHOD if_bali_log_db~save_log.
2113
+ DATA header TYPE REF TO if_bali_header_getter.
2114
+ DATA impl TYPE REF TO cl_bali_log.
2115
+ TRY.
2116
+ header = log->get_header( ).
2117
+ CATCH cx_bali_runtime.
2118
+ RAISE EXCEPTION NEW cx_bali_not_possible( zrap_text = \`the log has no header: set_header before save_log\` ).
2119
+ ENDTRY.
2120
+ impl ?= log.
2121
+ zrap_eml=>bali_save( handle = |{ log->get_handle( ) }|
2122
+ object = |{ header->object }|
2123
+ subobject = |{ header->subobject }|
2124
+ external_id = |{ header->external_id }|
2125
+ expiry_date = header->expiry_date
2126
+ items = impl->zrap_items( ) ).
2127
+ ENDMETHOD.
2128
+
2129
+ METHOD if_bali_log_db~load_log.
2130
+ DATA logs TYPE if_bali_log_db=>ty_log_table.
2131
+ logs = load( handle = handle ).
2132
+ IF lines( logs ) = 0.
2133
+ RAISE EXCEPTION NEW cx_bali_not_possible( zrap_text = |no application log { handle }| ).
2134
+ ENDIF.
2135
+ log = logs[ 1 ].
2136
+ ENDMETHOD.
2137
+
2138
+ METHOD if_bali_log_db~load_logs_via_filter.
2139
+ log_table = load( filter = filter ).
2140
+ ENDMETHOD.
2141
+
2142
+ METHOD if_bali_log_db~load_logs_w_items_via_filter.
2143
+ log_table = load( filter = filter ).
2144
+ ENDMETHOD.
2145
+
2146
+ METHOD if_bali_log_db~delete_log.
2147
+ zrap_eml=>bali_delete( |{ log->get_handle( ) }| ).
2148
+ ENDMETHOD.
2149
+
2150
+ METHOD load.
2151
+ TYPES: BEGIN OF ty_log,
2152
+ handle TYPE string,
2153
+ object TYPE string,
2154
+ subobject TYPE string,
2155
+ external_id TYPE string,
2156
+ expiry_date TYPE d,
2157
+ log_user TYPE string,
2158
+ log_timestamp TYPE timestampl,
2159
+ END OF ty_log.
2160
+ DATA logs TYPE STANDARD TABLE OF ty_log WITH EMPTY KEY.
2161
+ DATA items TYPE cl_bali_log=>zrap_tt_item.
2162
+ DATA entry TYPE ty_log.
2163
+ DATA item TYPE cl_bali_log=>zrap_ty_item.
2164
+ DATA log TYPE REF TO cl_bali_log.
2165
+ DATA header TYPE REF TO cl_bali_header_setter.
2166
+ DATA log_handle TYPE if_bali_log=>ty_handle.
2167
+ DATA user TYPE syuname.
2168
+ IF filter IS BOUND.
2169
+ zrap_eml=>bali_query( EXPORTING object = |{ filter->object }|
2170
+ subobject = |{ filter->subobject }|
2171
+ external_id = |{ filter->external_id }|
2172
+ user = |{ filter->user }|
2173
+ start_time = filter->start_time
2174
+ end_time = filter->end_time
2175
+ max_count = filter->max_log_number
2176
+ CHANGING logs = logs ).
2177
+ ELSE.
2178
+ zrap_eml=>bali_query( EXPORTING handle = |{ handle }| CHANGING logs = logs ).
2179
+ ENDIF.
2180
+ LOOP AT logs INTO entry.
2181
+ log_handle = entry-handle.
2182
+ log = NEW cl_bali_log( log_handle ).
2183
+ header = NEW cl_bali_header_setter( ).
2184
+ header->if_bali_header_setter~set_descriptor( object = |{ entry-object }|
2185
+ subobject = |{ entry-subobject }|
2186
+ external_id = |{ entry-external_id }| ).
2187
+ IF entry-expiry_date IS NOT INITIAL.
2188
+ header->if_bali_header_setter~set_expiry( entry-expiry_date ).
2189
+ ENDIF.
2190
+ user = entry-log_user.
2191
+ header->zrap_set_creation( log_user = user log_timestamp = entry-log_timestamp ).
2192
+ log->if_bali_log~set_header( header ).
2193
+ CLEAR items.
2194
+ zrap_eml=>bali_items( EXPORTING handle = entry-handle CHANGING items = items ).
2195
+ LOOP AT items INTO item.
2196
+ log->zrap_add( item ).
2197
+ ENDLOOP.
2198
+ APPEND log TO log_table.
2199
+ ENDLOOP.
2200
+ ENDMETHOD.
2201
+ ENDCLASS.
2202
+ `;
2203
+ // ------------------------------------------------------------------------------ hashes
2204
+ const CL_ABAP_MESSAGE_DIGEST = `CLASS cl_abap_message_digest DEFINITION PUBLIC FINAL CREATE PRIVATE.
2205
+ PUBLIC SECTION.
2206
+ CLASS-METHODS calculate_hash_for_char
2207
+ IMPORTING if_algorithm TYPE string DEFAULT \`SHA1\`
2208
+ if_data TYPE csequence
2209
+ if_length TYPE i DEFAULT 0
2210
+ if_offset TYPE i DEFAULT 0
2211
+ EXPORTING ef_hashstring TYPE string
2212
+ ef_hashxstring TYPE xstring
2213
+ ef_hashb64string TYPE string
2214
+ RAISING cx_abap_message_digest.
2215
+ CLASS-METHODS calculate_hash_for_raw
2216
+ IMPORTING if_algorithm TYPE string DEFAULT \`SHA1\`
2217
+ if_data TYPE xsequence
2218
+ if_length TYPE i DEFAULT 0
2219
+ if_offset TYPE i DEFAULT 0
2220
+ EXPORTING ef_hashstring TYPE string
2221
+ ef_hashxstring TYPE xstring
2222
+ ef_hashb64string TYPE string
2223
+ RAISING cx_abap_message_digest.
2224
+ CLASS-METHODS string_to_xstring
2225
+ IMPORTING if_input TYPE csequence
2226
+ RETURNING VALUE(er_output) TYPE xstring
2227
+ RAISING cx_abap_message_digest.
2228
+ ENDCLASS.
2229
+
2230
+ CLASS cl_abap_message_digest IMPLEMENTATION.
2231
+ METHOD calculate_hash_for_char.
2232
+ DATA text TYPE string.
2233
+ text = if_data.
2234
+ IF if_offset > 0 OR if_length > 0.
2235
+ IF if_length > 0.
2236
+ text = substring( val = text off = if_offset len = if_length ).
2237
+ ELSE.
2238
+ text = substring( val = text off = if_offset ).
2239
+ ENDIF.
2240
+ ENDIF.
2241
+ ef_hashxstring = zrap_eml=>digest( algorithm = if_algorithm data = zrap_eml=>codepage_out( codepage = \`UTF-8\` source = text ) ).
2242
+ ef_hashstring = ef_hashxstring.
2243
+ ef_hashb64string = zrap_eml=>base64_encode_x( ef_hashxstring ).
2244
+ ENDMETHOD.
2245
+
2246
+ METHOD calculate_hash_for_raw.
2247
+ DATA bytes TYPE xstring.
2248
+ bytes = if_data.
2249
+ IF if_offset > 0 OR if_length > 0.
2250
+ IF if_length > 0.
2251
+ bytes = bytes+if_offset(if_length).
2252
+ ELSE.
2253
+ bytes = bytes+if_offset.
2254
+ ENDIF.
2255
+ ENDIF.
2256
+ ef_hashxstring = zrap_eml=>digest( algorithm = if_algorithm data = bytes ).
2257
+ ef_hashstring = ef_hashxstring.
2258
+ ef_hashb64string = zrap_eml=>base64_encode_x( ef_hashxstring ).
2259
+ ENDMETHOD.
2260
+
2261
+ METHOD string_to_xstring.
2262
+ er_output = zrap_eml=>codepage_out( codepage = \`UTF-8\` source = |{ if_input }| ).
2263
+ ENDMETHOD.
2264
+ ENDCLASS.
2265
+ `;
2266
+ const CL_ABAP_HMAC = `CLASS cl_abap_hmac DEFINITION PUBLIC FINAL CREATE PRIVATE.
2267
+ PUBLIC SECTION.
2268
+ CLASS-METHODS calculate_hmac_for_char
2269
+ IMPORTING if_algorithm TYPE string DEFAULT \`SHA1\`
2270
+ if_key TYPE xstring
2271
+ if_data TYPE csequence
2272
+ if_length TYPE i DEFAULT 0
2273
+ if_offset TYPE i DEFAULT 0
2274
+ EXPORTING ef_hmacstring TYPE string
2275
+ ef_hmacxstring TYPE xstring
2276
+ ef_hmacb64string TYPE string
2277
+ RAISING cx_abap_message_digest.
2278
+ CLASS-METHODS calculate_hmac_for_raw
2279
+ IMPORTING if_algorithm TYPE string DEFAULT \`SHA1\`
2280
+ if_key TYPE xstring
2281
+ if_data TYPE xsequence
2282
+ if_length TYPE i DEFAULT 0
2283
+ if_offset TYPE i DEFAULT 0
2284
+ EXPORTING ef_hmacstring TYPE string
2285
+ ef_hmacxstring TYPE xstring
2286
+ ef_hmacb64string TYPE string
2287
+ RAISING cx_abap_message_digest.
2288
+ CLASS-METHODS string_to_xstring
2289
+ IMPORTING if_input TYPE csequence
2290
+ RETURNING VALUE(er_output) TYPE xstring
2291
+ RAISING cx_abap_message_digest.
2292
+ ENDCLASS.
2293
+
2294
+ CLASS cl_abap_hmac IMPLEMENTATION.
2295
+ METHOD calculate_hmac_for_char.
2296
+ DATA text TYPE string.
2297
+ text = if_data.
2298
+ IF if_offset > 0 OR if_length > 0.
2299
+ IF if_length > 0.
2300
+ text = substring( val = text off = if_offset len = if_length ).
2301
+ ELSE.
2302
+ text = substring( val = text off = if_offset ).
2303
+ ENDIF.
2304
+ ENDIF.
2305
+ ef_hmacxstring = zrap_eml=>digest( algorithm = if_algorithm key = if_key data = zrap_eml=>codepage_out( codepage = \`UTF-8\` source = text ) ).
2306
+ ef_hmacstring = ef_hmacxstring.
2307
+ ef_hmacb64string = zrap_eml=>base64_encode_x( ef_hmacxstring ).
2308
+ ENDMETHOD.
2309
+
2310
+ METHOD calculate_hmac_for_raw.
2311
+ DATA bytes TYPE xstring.
2312
+ bytes = if_data.
2313
+ IF if_offset > 0 OR if_length > 0.
2314
+ IF if_length > 0.
2315
+ bytes = bytes+if_offset(if_length).
2316
+ ELSE.
2317
+ bytes = bytes+if_offset.
2318
+ ENDIF.
2319
+ ENDIF.
2320
+ ef_hmacxstring = zrap_eml=>digest( algorithm = if_algorithm key = if_key data = bytes ).
2321
+ ef_hmacstring = ef_hmacxstring.
2322
+ ef_hmacb64string = zrap_eml=>base64_encode_x( ef_hmacxstring ).
2323
+ ENDMETHOD.
2324
+
2325
+ METHOD string_to_xstring.
2326
+ er_output = zrap_eml=>codepage_out( codepage = \`UTF-8\` source = |{ if_input }| ).
2327
+ ENDMETHOD.
2328
+ ENDCLASS.
2329
+ `;
2330
+ // ------------------------------------------------------------------------------ random numbers
2331
+ /** A Park-Miller generator (multiplier 48271, modulus 2^31 - 1), seeded by the kernel. */
2332
+ const CL_ABAP_RANDOM = `CLASS cl_abap_random DEFINITION PUBLIC CREATE PUBLIC.
2333
+ PUBLIC SECTION.
2334
+ CLASS-METHODS seed RETURNING VALUE(seed) TYPE i.
2335
+ CLASS-METHODS create
2336
+ IMPORTING seed TYPE i OPTIONAL
2337
+ RETURNING VALUE(prng) TYPE REF TO cl_abap_random.
2338
+ METHODS constructor IMPORTING seed TYPE i OPTIONAL.
2339
+ "! An integer in [0, 2^31 - 2].
2340
+ METHODS int RETURNING VALUE(value) TYPE i.
2341
+ METHODS int31 RETURNING VALUE(value) TYPE i.
2342
+ METHODS intinrange
2343
+ IMPORTING low TYPE i
2344
+ high TYPE i
2345
+ RETURNING VALUE(value) TYPE i.
2346
+ "! A float in [0, 1).
2347
+ METHODS float RETURNING VALUE(value) TYPE f.
2348
+ METHODS decfloat34 RETURNING VALUE(value) TYPE decfloat34.
2349
+ PROTECTED SECTION.
2350
+ DATA state TYPE int8.
2351
+ METHODS next RETURNING VALUE(value) TYPE int8.
2352
+ ENDCLASS.
2353
+
2354
+ CLASS cl_abap_random IMPLEMENTATION.
2355
+ METHOD seed.
2356
+ seed = zrap_eml=>random_seed( ).
2357
+ ENDMETHOD.
2358
+
2359
+ METHOD create.
2360
+ IF seed IS SUPPLIED.
2361
+ prng = NEW cl_abap_random( seed ).
2362
+ ELSE.
2363
+ prng = NEW cl_abap_random( ).
2364
+ ENDIF.
2365
+ ENDMETHOD.
2366
+
2367
+ METHOD constructor.
2368
+ IF seed IS SUPPLIED.
2369
+ state = seed MOD 2147483647.
2370
+ ELSE.
2371
+ state = zrap_eml=>random_seed( ) MOD 2147483647.
2372
+ ENDIF.
2373
+ IF state <= 0.
2374
+ state = state + 2147483646.
2375
+ ENDIF.
2376
+ ENDMETHOD.
2377
+
2378
+ METHOD next.
2379
+ state = ( state * 48271 ) MOD 2147483647.
2380
+ value = state - 1.
2381
+ ENDMETHOD.
2382
+
2383
+ METHOD int.
2384
+ value = next( ).
2385
+ ENDMETHOD.
2386
+
2387
+ METHOD int31.
2388
+ value = next( ).
2389
+ ENDMETHOD.
2390
+
2391
+ METHOD intinrange.
2392
+ DATA range TYPE int8.
2393
+ range = high - low + 1.
2394
+ value = low + next( ) MOD range.
2395
+ ENDMETHOD.
2396
+
2397
+ METHOD float.
2398
+ value = next( ) / 2147483646.
2399
+ ENDMETHOD.
2400
+
2401
+ METHOD decfloat34.
2402
+ value = next( ) / 2147483646.
2403
+ ENDMETHOD.
2404
+ ENDCLASS.
2405
+ `;
2406
+ const randomTyped = (name, type, range, next) => ({
2407
+ fileName: `${name}.clas.abap`,
2408
+ source: `CLASS ${name} DEFINITION PUBLIC FINAL CREATE PRIVATE.
2409
+ PUBLIC SECTION.
2410
+ CLASS-METHODS create
2411
+ IMPORTING seed TYPE i OPTIONAL${range === undefined ? "" : `\n min TYPE ${type} OPTIONAL\n max TYPE ${type} OPTIONAL`}
2412
+ RETURNING VALUE(prng) TYPE REF TO ${name}
2413
+ RAISING cx_abap_random.
2414
+ METHODS get_next RETURNING VALUE(value) TYPE ${type}.
2415
+ PRIVATE SECTION.
2416
+ DATA generator TYPE REF TO cl_abap_random.
2417
+ DATA low TYPE ${type}.
2418
+ DATA high TYPE ${type}.
2419
+ ENDCLASS.
2420
+
2421
+ CLASS ${name} IMPLEMENTATION.
2422
+ METHOD create.
2423
+ prng = NEW ${name}( ).
2424
+ IF seed IS SUPPLIED.
2425
+ prng->generator = cl_abap_random=>create( seed ).
2426
+ ELSE.
2427
+ prng->generator = cl_abap_random=>create( ).
2428
+ ENDIF.${range === undefined
2429
+ ? ""
2430
+ : `
2431
+ prng->low = ${range.min}.
2432
+ prng->high = ${range.max}.
2433
+ IF min IS SUPPLIED.
2434
+ prng->low = min.
2435
+ ENDIF.
2436
+ IF max IS SUPPLIED.
2437
+ prng->high = max.
2438
+ ENDIF.
2439
+ IF prng->low > prng->high.
2440
+ RAISE EXCEPTION NEW cx_abap_random( zrap_text = |min { prng->low } is greater than max { prng->high }| ).
2441
+ ENDIF.`}
2442
+ ENDMETHOD.
2443
+
2444
+ METHOD get_next.
2445
+ ${next}
2446
+ ENDMETHOD.
2447
+ ENDCLASS.
2448
+ `,
2449
+ });
2450
+ const RANDOM_TYPED = [
2451
+ randomTyped("cl_abap_random_int", "i", { min: "-2147483647", max: "2147483647" }, ` DATA range TYPE decfloat34.
2452
+ range = high - low + 1.
2453
+ value = low + trunc( generator->decfloat34( ) * range ).`),
2454
+ randomTyped("cl_abap_random_int8", "int8", { min: "0", max: "2147483647" }, ` DATA range TYPE decfloat34.
2455
+ range = high - low + 1.
2456
+ value = low + trunc( generator->decfloat34( ) * range ).`),
2457
+ randomTyped("cl_abap_random_float", "f", undefined, ` value = generator->float( ).`),
2458
+ randomTyped("cl_abap_random_decfloat34", "decfloat34", undefined, ` value = generator->decfloat34( ).`),
2459
+ ];
2460
+ // ------------------------------------------------------------------------------ regular expressions
2461
+ const CL_ABAP_REGEX = `CLASS cl_abap_regex DEFINITION PUBLIC CREATE PUBLIC.
2462
+ PUBLIC SECTION.
2463
+ "! The pattern and its flags (i: ignore case, x: extended, m: multiline, s: dot all, p: PCRE).
2464
+ DATA pattern TYPE string READ-ONLY.
2465
+ DATA flags TYPE string READ-ONLY.
2466
+ METHODS constructor
2467
+ IMPORTING pattern TYPE csequence
2468
+ ignore_case TYPE abap_bool DEFAULT abap_false
2469
+ simple_regex TYPE abap_bool DEFAULT abap_false
2470
+ no_submatches TYPE abap_bool DEFAULT abap_false
2471
+ RAISING cx_sy_regex.
2472
+ CLASS-METHODS create_pcre
2473
+ IMPORTING pattern TYPE csequence
2474
+ ignore_case TYPE abap_bool DEFAULT abap_false
2475
+ extended TYPE abap_bool DEFAULT abap_true
2476
+ enable_multiline TYPE abap_bool DEFAULT abap_false
2477
+ dot_all TYPE abap_bool DEFAULT abap_false
2478
+ unicode_handling TYPE string OPTIONAL
2479
+ RETURNING VALUE(regex) TYPE REF TO cl_abap_regex
2480
+ RAISING cx_sy_regex.
2481
+ CLASS-METHODS create_posix
2482
+ IMPORTING pattern TYPE csequence
2483
+ ignore_case TYPE abap_bool DEFAULT abap_false
2484
+ RETURNING VALUE(regex) TYPE REF TO cl_abap_regex
2485
+ RAISING cx_sy_regex.
2486
+ METHODS create_matcher
2487
+ IMPORTING text TYPE clike OPTIONAL
2488
+ table TYPE string_table OPTIONAL
2489
+ RETURNING VALUE(matcher) TYPE REF TO cl_abap_matcher
2490
+ RAISING cx_sy_regex.
2491
+ METHODS zrap_set_flags IMPORTING flags TYPE string.
2492
+ ENDCLASS.
2493
+
2494
+ CLASS cl_abap_regex IMPLEMENTATION.
2495
+ METHOD constructor.
2496
+ me->pattern = pattern.
2497
+ IF ignore_case = abap_true.
2498
+ flags = \`i\`.
2499
+ ENDIF.
2500
+ zrap_eml=>regex_check( pattern = me->pattern flags = flags ).
2501
+ ENDMETHOD.
2502
+
2503
+ METHOD zrap_set_flags.
2504
+ me->flags = flags.
2505
+ zrap_eml=>regex_check( pattern = pattern flags = flags ).
2506
+ ENDMETHOD.
2507
+
2508
+ METHOD create_pcre.
2509
+ DATA flags TYPE string VALUE \`p\`.
2510
+ IF ignore_case = abap_true.
2511
+ flags = flags && \`i\`.
2512
+ ENDIF.
2513
+ IF extended = abap_true.
2514
+ flags = flags && \`x\`.
2515
+ ENDIF.
2516
+ IF enable_multiline = abap_true.
2517
+ flags = flags && \`m\`.
2518
+ ENDIF.
2519
+ IF dot_all = abap_true.
2520
+ flags = flags && \`s\`.
2521
+ ENDIF.
2522
+ regex = NEW cl_abap_regex( pattern ).
2523
+ regex->zrap_set_flags( flags ).
2524
+ ENDMETHOD.
2525
+
2526
+ METHOD create_posix.
2527
+ regex = NEW cl_abap_regex( pattern = pattern ignore_case = ignore_case ).
2528
+ ENDMETHOD.
2529
+
2530
+ METHOD create_matcher.
2531
+ DATA content TYPE string.
2532
+ IF table IS SUPPLIED.
2533
+ content = concat_lines_of( table = table sep = |\\n| ).
2534
+ ELSE.
2535
+ content = text.
2536
+ ENDIF.
2537
+ matcher = NEW cl_abap_matcher( regex = me text = content ).
2538
+ ENDMETHOD.
2539
+ ENDCLASS.
2540
+ `;
2541
+ const CL_ABAP_MATCHER = `CLASS cl_abap_matcher DEFINITION PUBLIC CREATE PUBLIC.
2542
+ PUBLIC SECTION.
2543
+ DATA text TYPE string READ-ONLY.
2544
+ DATA regex TYPE REF TO cl_abap_regex READ-ONLY.
2545
+ METHODS constructor
2546
+ IMPORTING regex TYPE REF TO cl_abap_regex
2547
+ text TYPE string.
2548
+ CLASS-METHODS create
2549
+ IMPORTING pattern TYPE csequence
2550
+ text TYPE clike OPTIONAL
2551
+ table TYPE string_table OPTIONAL
2552
+ ignore_case TYPE abap_bool DEFAULT abap_false
2553
+ simple_regex TYPE abap_bool DEFAULT abap_false
2554
+ no_submatches TYPE abap_bool DEFAULT abap_false
2555
+ RETURNING VALUE(matcher) TYPE REF TO cl_abap_matcher
2556
+ RAISING cx_sy_regex.
2557
+ CLASS-METHODS create_pcre
2558
+ IMPORTING pattern TYPE csequence
2559
+ text TYPE clike OPTIONAL
2560
+ table TYPE string_table OPTIONAL
2561
+ ignore_case TYPE abap_bool DEFAULT abap_false
2562
+ extended TYPE abap_bool DEFAULT abap_true
2563
+ enable_multiline TYPE abap_bool DEFAULT abap_false
2564
+ dot_all TYPE abap_bool DEFAULT abap_false
2565
+ RETURNING VALUE(matcher) TYPE REF TO cl_abap_matcher
2566
+ RAISING cx_sy_regex.
2567
+ CLASS-METHODS matches
2568
+ IMPORTING pattern TYPE csequence
2569
+ text TYPE clike
2570
+ ignore_case TYPE abap_bool DEFAULT abap_false
2571
+ RETURNING VALUE(success) TYPE abap_bool
2572
+ RAISING cx_sy_regex.
2573
+ CLASS-METHODS contains
2574
+ IMPORTING pattern TYPE csequence
2575
+ text TYPE clike
2576
+ ignore_case TYPE abap_bool DEFAULT abap_false
2577
+ RETURNING VALUE(success) TYPE abap_bool
2578
+ RAISING cx_sy_regex.
2579
+ METHODS find_next RETURNING VALUE(success) TYPE abap_bool.
2580
+ METHODS find_all RETURNING VALUE(matches) TYPE match_result_tab.
2581
+ METHODS match RETURNING VALUE(success) TYPE abap_bool.
2582
+ METHODS get_match RETURNING VALUE(match) TYPE match_result.
2583
+ METHODS get_offset
2584
+ IMPORTING index TYPE i DEFAULT 0
2585
+ RETURNING VALUE(offset) TYPE i.
2586
+ METHODS get_length
2587
+ IMPORTING index TYPE i DEFAULT 0
2588
+ RETURNING VALUE(length) TYPE i.
2589
+ METHODS get_submatch
2590
+ IMPORTING index TYPE i
2591
+ RETURNING VALUE(submatch) TYPE string.
2592
+ METHODS replace_all
2593
+ IMPORTING newtext TYPE csequence
2594
+ RETURNING VALUE(count) TYPE i.
2595
+ METHODS replace_found
2596
+ IMPORTING newtext TYPE csequence
2597
+ RETURNING VALUE(success) TYPE abap_bool.
2598
+ METHODS replace_next
2599
+ IMPORTING newtext TYPE csequence
2600
+ RETURNING VALUE(success) TYPE abap_bool.
2601
+ PRIVATE SECTION.
2602
+ DATA position TYPE i.
2603
+ DATA current TYPE match_result.
2604
+ DATA found TYPE abap_bool.
2605
+ METHODS search
2606
+ IMPORTING start TYPE i
2607
+ RETURNING VALUE(match) TYPE match_result.
2608
+ ENDCLASS.
2609
+
2610
+ CLASS cl_abap_matcher IMPLEMENTATION.
2611
+ METHOD constructor.
2612
+ me->regex = regex.
2613
+ me->text = text.
2614
+ ENDMETHOD.
2615
+
2616
+ METHOD create.
2617
+ DATA regex TYPE REF TO cl_abap_regex.
2618
+ regex = NEW cl_abap_regex( pattern = pattern ignore_case = ignore_case ).
2619
+ IF table IS SUPPLIED.
2620
+ matcher = regex->create_matcher( table = table ).
2621
+ ELSE.
2622
+ matcher = regex->create_matcher( text = text ).
2623
+ ENDIF.
2624
+ ENDMETHOD.
2625
+
2626
+ METHOD create_pcre.
2627
+ DATA regex TYPE REF TO cl_abap_regex.
2628
+ regex = cl_abap_regex=>create_pcre( pattern = pattern ignore_case = ignore_case extended = extended
2629
+ enable_multiline = enable_multiline dot_all = dot_all ).
2630
+ IF table IS SUPPLIED.
2631
+ matcher = regex->create_matcher( table = table ).
2632
+ ELSE.
2633
+ matcher = regex->create_matcher( text = text ).
2634
+ ENDIF.
2635
+ ENDMETHOD.
2636
+
2637
+ METHOD matches.
2638
+ success = create( pattern = pattern text = text ignore_case = ignore_case )->match( ).
2639
+ ENDMETHOD.
2640
+
2641
+ METHOD contains.
2642
+ success = create( pattern = pattern text = text ignore_case = ignore_case )->find_next( ).
2643
+ ENDMETHOD.
2644
+
2645
+ METHOD search.
2646
+ DATA submatches TYPE string.
2647
+ DATA parts TYPE string_table.
2648
+ DATA part TYPE string.
2649
+ DATA offset TYPE string.
2650
+ DATA length TYPE string.
2651
+ DATA found_at TYPE i.
2652
+ DATA found_length TYPE i.
2653
+ zrap_eml=>regex_find( EXPORTING pattern = regex->pattern
2654
+ flags = regex->flags
2655
+ text = text
2656
+ start = start
2657
+ IMPORTING offset = found_at
2658
+ length = found_length
2659
+ submatches = submatches ).
2660
+ IF found_at < 0.
2661
+ match-offset = -1.
2662
+ RETURN.
2663
+ ENDIF.
2664
+ match-offset = found_at.
2665
+ match-length = found_length.
2666
+ IF submatches IS NOT INITIAL.
2667
+ SPLIT submatches AT \` \` INTO TABLE parts.
2668
+ LOOP AT parts INTO part.
2669
+ SPLIT part AT \`,\` INTO offset length.
2670
+ APPEND VALUE #( offset = offset length = length ) TO match-submatches.
2671
+ ENDLOOP.
2672
+ ENDIF.
2673
+ ENDMETHOD.
2674
+
2675
+ METHOD find_next.
2676
+ current = search( position ).
2677
+ IF current-offset < 0.
2678
+ found = abap_false.
2679
+ success = abap_false.
2680
+ RETURN.
2681
+ ENDIF.
2682
+ found = abap_true.
2683
+ success = abap_true.
2684
+ position = current-offset + current-length.
2685
+ IF current-length = 0.
2686
+ position = position + 1.
2687
+ ENDIF.
2688
+ ENDMETHOD.
2689
+
2690
+ METHOD find_all.
2691
+ position = 0.
2692
+ WHILE find_next( ) = abap_true.
2693
+ APPEND current TO matches.
2694
+ ENDWHILE.
2695
+ ENDMETHOD.
2696
+
2697
+ METHOD match.
2698
+ DATA whole TYPE match_result.
2699
+ whole = search( 0 ).
2700
+ success = xsdbool( whole-offset = 0 AND whole-length = strlen( text ) ).
2701
+ IF success = abap_true.
2702
+ current = whole.
2703
+ found = abap_true.
2704
+ ENDIF.
2705
+ ENDMETHOD.
2706
+
2707
+ METHOD get_match.
2708
+ match = current.
2709
+ ENDMETHOD.
2710
+
2711
+ METHOD get_offset.
2712
+ IF index = 0.
2713
+ offset = current-offset.
2714
+ ELSE.
2715
+ offset = current-submatches[ index ]-offset.
2716
+ ENDIF.
2717
+ ENDMETHOD.
2718
+
2719
+ METHOD get_length.
2720
+ IF index = 0.
2721
+ length = current-length.
2722
+ ELSE.
2723
+ length = current-submatches[ index ]-length.
2724
+ ENDIF.
2725
+ ENDMETHOD.
2726
+
2727
+ METHOD get_submatch.
2728
+ DATA offset TYPE i.
2729
+ DATA length TYPE i.
2730
+ IF index = 0.
2731
+ offset = current-offset.
2732
+ length = current-length.
2733
+ ELSE.
2734
+ offset = current-submatches[ index ]-offset.
2735
+ length = current-submatches[ index ]-length.
2736
+ ENDIF.
2737
+ IF offset >= 0.
2738
+ submatch = substring( val = text off = offset len = length ).
2739
+ ENDIF.
2740
+ ENDMETHOD.
2741
+
2742
+ METHOD replace_all.
2743
+ text = zrap_eml=>regex_replace( EXPORTING pattern = regex->pattern
2744
+ flags = regex->flags
2745
+ text = text
2746
+ newtext = |{ newtext }|
2747
+ all = abap_true
2748
+ IMPORTING count = count ).
2749
+ position = 0.
2750
+ found = abap_false.
2751
+ ENDMETHOD.
2752
+
2753
+ METHOD replace_found.
2754
+ DATA replacement TYPE string.
2755
+ IF found = abap_false.
2756
+ RETURN.
2757
+ ENDIF.
2758
+ replacement = zrap_eml=>regex_replace( pattern = regex->pattern
2759
+ flags = regex->flags
2760
+ text = substring( val = text off = current-offset len = current-length )
2761
+ newtext = |{ newtext }| ).
2762
+ text = substring( val = text len = current-offset ) && replacement && substring( val = text off = current-offset + current-length ).
2763
+ position = current-offset + strlen( replacement ).
2764
+ found = abap_false.
2765
+ success = abap_true.
2766
+ ENDMETHOD.
2767
+
2768
+ METHOD replace_next.
2769
+ IF find_next( ) = abap_false.
2770
+ RETURN.
2771
+ ENDIF.
2772
+ success = replace_found( newtext ).
2773
+ ENDMETHOD.
2774
+ ENDCLASS.
2775
+ `;
2776
+ // ------------------------------------------------------------------------------ RTTS
2777
+ const CL_ABAP_TYPEDESCR = `CLASS cl_abap_typedescr DEFINITION PUBLIC ABSTRACT CREATE PUBLIC.
2778
+ PUBLIC SECTION.
2779
+ CONSTANTS typekind_any TYPE abap_typekind VALUE '~'.
2780
+ CONSTANTS typekind_char TYPE abap_typekind VALUE 'C'.
2781
+ CONSTANTS typekind_class TYPE abap_typekind VALUE '*'.
2782
+ CONSTANTS typekind_clike TYPE abap_typekind VALUE '&'.
2783
+ CONSTANTS typekind_csequence TYPE abap_typekind VALUE '?'.
2784
+ CONSTANTS typekind_data TYPE abap_typekind VALUE '#'.
2785
+ CONSTANTS typekind_date TYPE abap_typekind VALUE 'D'.
2786
+ CONSTANTS typekind_decfloat TYPE abap_typekind VALUE '/'.
2787
+ CONSTANTS typekind_decfloat16 TYPE abap_typekind VALUE 'a'.
2788
+ CONSTANTS typekind_decfloat34 TYPE abap_typekind VALUE 'e'.
2789
+ CONSTANTS typekind_dref TYPE abap_typekind VALUE 'l'.
2790
+ CONSTANTS typekind_float TYPE abap_typekind VALUE 'F'.
2791
+ CONSTANTS typekind_hex TYPE abap_typekind VALUE 'X'.
2792
+ CONSTANTS typekind_int TYPE abap_typekind VALUE 'I'.
2793
+ CONSTANTS typekind_int1 TYPE abap_typekind VALUE 'b'.
2794
+ CONSTANTS typekind_int2 TYPE abap_typekind VALUE 's'.
2795
+ CONSTANTS typekind_int8 TYPE abap_typekind VALUE '8'.
2796
+ CONSTANTS typekind_intf TYPE abap_typekind VALUE '+'.
2797
+ CONSTANTS typekind_iref TYPE abap_typekind VALUE 'm'.
2798
+ CONSTANTS typekind_num TYPE abap_typekind VALUE 'N'.
2799
+ CONSTANTS typekind_numeric TYPE abap_typekind VALUE '%'.
2800
+ CONSTANTS typekind_oref TYPE abap_typekind VALUE 'r'.
2801
+ CONSTANTS typekind_packed TYPE abap_typekind VALUE 'P'.
2802
+ CONSTANTS typekind_simple TYPE abap_typekind VALUE '$'.
2803
+ CONSTANTS typekind_string TYPE abap_typekind VALUE 'g'.
2804
+ CONSTANTS typekind_struct1 TYPE abap_typekind VALUE 'u'.
2805
+ CONSTANTS typekind_struct2 TYPE abap_typekind VALUE 'v'.
2806
+ CONSTANTS typekind_table TYPE abap_typekind VALUE 'h'.
2807
+ CONSTANTS typekind_time TYPE abap_typekind VALUE 'T'.
2808
+ CONSTANTS typekind_utclong TYPE abap_typekind VALUE 'p'.
2809
+ CONSTANTS typekind_w TYPE abap_typekind VALUE 'w'.
2810
+ CONSTANTS typekind_xsequence TYPE abap_typekind VALUE '!'.
2811
+ CONSTANTS typekind_xstring TYPE abap_typekind VALUE 'y'.
2812
+ CONSTANTS kind_elem TYPE c LENGTH 1 VALUE 'E'.
2813
+ CONSTANTS kind_struct TYPE c LENGTH 1 VALUE 'S'.
2814
+ CONSTANTS kind_table TYPE c LENGTH 1 VALUE 'T'.
2815
+ CONSTANTS kind_ref TYPE c LENGTH 1 VALUE 'R'.
2816
+ CONSTANTS kind_class TYPE c LENGTH 1 VALUE 'C'.
2817
+ CONSTANTS kind_intf TYPE c LENGTH 1 VALUE 'I'.
2818
+ DATA absolute_name TYPE abap_abstypename READ-ONLY.
2819
+ DATA type_kind TYPE abap_typekind READ-ONLY.
2820
+ DATA length TYPE i READ-ONLY.
2821
+ DATA decimals TYPE i READ-ONLY.
2822
+ DATA kind TYPE c LENGTH 1 READ-ONLY.
2823
+ CLASS-METHODS describe_by_data
2824
+ IMPORTING p_data TYPE any
2825
+ RETURNING VALUE(p_descr_ref) TYPE REF TO cl_abap_typedescr.
2826
+ CLASS-METHODS describe_by_data_ref
2827
+ IMPORTING p_data_ref TYPE REF TO data
2828
+ RETURNING VALUE(p_descr_ref) TYPE REF TO cl_abap_typedescr.
2829
+ CLASS-METHODS describe_by_object_ref
2830
+ IMPORTING p_object_ref TYPE REF TO object
2831
+ RETURNING VALUE(p_descr_ref) TYPE REF TO cl_abap_typedescr.
2832
+ CLASS-METHODS describe_by_name
2833
+ IMPORTING p_name TYPE any
2834
+ RETURNING VALUE(p_descr_ref) TYPE REF TO cl_abap_typedescr
2835
+ RAISING cx_sy_rtti_type_not_released.
2836
+ METHODS get_relative_name RETURNING VALUE(p_relative_name) TYPE string.
2837
+ METHODS is_ddic_type RETURNING VALUE(p_abap_bool) TYPE abap_bool.
2838
+ METHODS zrap_init
2839
+ IMPORTING kind TYPE csequence
2840
+ type_kind TYPE csequence
2841
+ length TYPE i
2842
+ decimals TYPE i
2843
+ absolute_name TYPE csequence.
2844
+ ENDCLASS.
2845
+
2846
+ CLASS cl_abap_typedescr IMPLEMENTATION.
2847
+ METHOD describe_by_data.
2848
+ DATA lv_kind TYPE string.
2849
+ DATA lv_type_kind TYPE string.
2850
+ DATA lv_length TYPE i.
2851
+ DATA lv_decimals TYPE i.
2852
+ DATA lv_name TYPE string.
2853
+ DATA lv_components TYPE string.
2854
+ DATA parts TYPE string_table.
2855
+ DATA part TYPE string.
2856
+ DATA structdescr TYPE REF TO cl_abap_structdescr.
2857
+ DATA tabledescr TYPE REF TO cl_abap_tabledescr.
2858
+ DATA refdescr TYPE REF TO cl_abap_refdescr.
2859
+ DATA line TYPE REF TO data.
2860
+ FIELD-SYMBOLS <component> TYPE any.
2861
+ FIELD-SYMBOLS <table> TYPE ANY TABLE.
2862
+ FIELD-SYMBOLS <line> TYPE any.
2863
+ zrap_eml=>rtti_describe( EXPORTING data = p_data
2864
+ IMPORTING kind = lv_kind
2865
+ type_kind = lv_type_kind
2866
+ length = lv_length
2867
+ decimals = lv_decimals
2868
+ name = lv_name
2869
+ components = lv_components ).
2870
+ CASE lv_kind.
2871
+ WHEN \`S\`.
2872
+ structdescr = NEW cl_abap_structdescr( ).
2873
+ SPLIT lv_components AT \` \` INTO TABLE parts.
2874
+ LOOP AT parts INTO part.
2875
+ ASSIGN COMPONENT part OF STRUCTURE p_data TO <component>.
2876
+ IF sy-subrc = 0.
2877
+ structdescr->zrap_add_component( name = part type = CAST cl_abap_datadescr( describe_by_data( <component> ) ) ).
2878
+ ENDIF.
2879
+ ENDLOOP.
2880
+ p_descr_ref = structdescr.
2881
+ WHEN \`T\`.
2882
+ tabledescr = NEW cl_abap_tabledescr( ).
2883
+ ASSIGN p_data TO <table>.
2884
+ CREATE DATA line LIKE LINE OF <table>.
2885
+ ASSIGN line->* TO <line>.
2886
+ tabledescr->zrap_set_line( CAST cl_abap_datadescr( describe_by_data( <line> ) ) ).
2887
+ p_descr_ref = tabledescr.
2888
+ WHEN \`R\`.
2889
+ refdescr = NEW cl_abap_refdescr( ).
2890
+ p_descr_ref = refdescr.
2891
+ WHEN OTHERS.
2892
+ p_descr_ref = NEW cl_abap_elemdescr( ).
2893
+ ENDCASE.
2894
+ p_descr_ref->zrap_init( kind = lv_kind type_kind = lv_type_kind length = lv_length decimals = lv_decimals absolute_name = lv_name ).
2895
+ ENDMETHOD.
2896
+
2897
+ METHOD describe_by_data_ref.
2898
+ FIELD-SYMBOLS <data> TYPE any.
2899
+ ASSIGN p_data_ref->* TO <data>.
2900
+ p_descr_ref = describe_by_data( <data> ).
2901
+ ENDMETHOD.
2902
+
2903
+ METHOD describe_by_object_ref.
2904
+ DATA classdescr TYPE REF TO cl_abap_classdescr.
2905
+ classdescr = NEW cl_abap_classdescr( ).
2906
+ classdescr->zrap_init( kind = kind_class type_kind = typekind_class length = 0 decimals = 0
2907
+ absolute_name = |\\\\CLASS={ zrap_eml=>class_name( p_object_ref ) }| ).
2908
+ p_descr_ref = classdescr.
2909
+ ENDMETHOD.
2910
+
2911
+ METHOD describe_by_name.
2912
+ RAISE EXCEPTION NEW cx_sy_rtti_type_not_released( zrap_text = |describe_by_name( { p_name } ) is not supported: use describe_by_data| ).
2913
+ ENDMETHOD.
2914
+
2915
+ METHOD get_relative_name.
2916
+ DATA parts TYPE string_table.
2917
+ IF absolute_name CS \`=\`.
2918
+ SPLIT absolute_name AT \`=\` INTO TABLE parts.
2919
+ p_relative_name = parts[ lines( parts ) ].
2920
+ ENDIF.
2921
+ ENDMETHOD.
2922
+
2923
+ METHOD is_ddic_type.
2924
+ p_abap_bool = xsdbool( absolute_name CP '\\TYPE=*' ).
2925
+ ENDMETHOD.
2926
+
2927
+ METHOD zrap_init.
2928
+ me->kind = kind.
2929
+ me->type_kind = type_kind.
2930
+ me->length = length.
2931
+ me->decimals = decimals.
2932
+ me->absolute_name = absolute_name.
2933
+ ENDMETHOD.
2934
+ ENDCLASS.
2935
+ `;
2936
+ const rttsClass = (name, superclass, body = "", implementation = "") => ({
2937
+ fileName: `${name}.clas.abap`,
2938
+ source: `CLASS ${name} DEFINITION PUBLIC INHERITING FROM ${superclass} CREATE PUBLIC.
2939
+ PUBLIC SECTION.
2940
+ ${body}ENDCLASS.
2941
+
2942
+ CLASS ${name} IMPLEMENTATION.
2943
+ ${implementation}ENDCLASS.
2944
+ `,
2945
+ });
2946
+ const RTTS = [
2947
+ rttsClass("cl_abap_datadescr", "cl_abap_typedescr"),
2948
+ rttsClass("cl_abap_elemdescr", "cl_abap_datadescr", ` METHODS get_ddic_field RETURNING VALUE(p_flddescr) TYPE string.
2949
+ DATA output_length TYPE i READ-ONLY.
2950
+ `, ` METHOD get_ddic_field.
2951
+ ENDMETHOD.
2952
+ `),
2953
+ rttsClass("cl_abap_complexdescr", "cl_abap_datadescr"),
2954
+ rttsClass("cl_abap_structdescr", "cl_abap_complexdescr", ` DATA components TYPE abap_compdescr_tab READ-ONLY.
2955
+ DATA struct_kind TYPE c LENGTH 1 READ-ONLY.
2956
+ METHODS get_components RETURNING VALUE(p_result) TYPE abap_component_tab.
2957
+ METHODS get_component_type
2958
+ IMPORTING p_name TYPE any
2959
+ RETURNING VALUE(p_descr_ref) TYPE REF TO cl_abap_datadescr.
2960
+ METHODS zrap_add_component
2961
+ IMPORTING name TYPE csequence
2962
+ type TYPE REF TO cl_abap_datadescr.
2963
+ PRIVATE SECTION.
2964
+ DATA types TYPE abap_component_tab.
2965
+ `, ` METHOD get_components.
2966
+ p_result = types.
2967
+ ENDMETHOD.
2968
+
2969
+ METHOD get_component_type.
2970
+ DATA component TYPE abap_componentdescr.
2971
+ DATA wanted TYPE string.
2972
+ wanted = to_upper( |{ p_name }| ).
2973
+ READ TABLE types INTO component WITH KEY name = wanted.
2974
+ IF sy-subrc = 0.
2975
+ p_descr_ref = component-type.
2976
+ ENDIF.
2977
+ ENDMETHOD.
2978
+
2979
+ METHOD zrap_add_component.
2980
+ DATA upper TYPE string.
2981
+ upper = to_upper( name ).
2982
+ APPEND VALUE #( name = upper type = type ) TO types.
2983
+ APPEND VALUE #( name = upper type_kind = type->type_kind length = type->length decimals = type->decimals ) TO components.
2984
+ ENDMETHOD.
2985
+ `),
2986
+ rttsClass("cl_abap_tabledescr", "cl_abap_complexdescr", ` DATA table_kind TYPE c LENGTH 1 READ-ONLY.
2987
+ METHODS get_table_line_type RETURNING VALUE(p_descr_ref) TYPE REF TO cl_abap_datadescr.
2988
+ METHODS zrap_set_line IMPORTING line TYPE REF TO cl_abap_datadescr.
2989
+ PRIVATE SECTION.
2990
+ DATA line TYPE REF TO cl_abap_datadescr.
2991
+ `, ` METHOD get_table_line_type.
2992
+ p_descr_ref = line.
2993
+ ENDMETHOD.
2994
+
2995
+ METHOD zrap_set_line.
2996
+ me->line = line.
2997
+ table_kind = 'S'.
2998
+ ENDMETHOD.
2999
+ `),
3000
+ rttsClass("cl_abap_refdescr", "cl_abap_datadescr"),
3001
+ rttsClass("cl_abap_objectdescr", "cl_abap_typedescr"),
3002
+ rttsClass("cl_abap_classdescr", "cl_abap_objectdescr"),
3003
+ rttsClass("cl_abap_intfdescr", "cl_abap_objectdescr"),
3004
+ ];
3005
+ // ------------------------------------------------------------------------------ background processing (D41)
3006
+ const IF_BGMC_OP_SINGLE = `INTERFACE if_bgmc_op_single PUBLIC.
3007
+ METHODS execute RAISING cx_bgmc_operation.
3008
+ ENDINTERFACE.
3009
+ `;
3010
+ const IF_BGMC_OP_SINGLE_TX_UNCONTR = `INTERFACE if_bgmc_op_single_tx_uncontr PUBLIC.
3011
+ METHODS execute RAISING cx_bgmc_operation.
3012
+ ENDINTERFACE.
3013
+ `;
3014
+ const IF_BGMC_PROCESS_MONITOR = `INTERFACE if_bgmc_process_monitor PUBLIC.
3015
+ TYPES ty_state TYPE string.
3016
+ CONSTANTS:
3017
+ BEGIN OF gcs_state,
3018
+ new TYPE ty_state VALUE \`NEW\`,
3019
+ running TYPE ty_state VALUE \`RUNNING\`,
3020
+ successful TYPE ty_state VALUE \`SUCCESSFUL\`,
3021
+ erroneous TYPE ty_state VALUE \`ERRONEOUS\`,
3022
+ END OF gcs_state.
3023
+ METHODS get_state
3024
+ RETURNING VALUE(rv_state) TYPE ty_state
3025
+ RAISING cx_bgmc.
3026
+ METHODS get_process_id RETURNING VALUE(rv_process_id) TYPE string.
3027
+ ENDINTERFACE.
3028
+ `;
3029
+ const IF_BGMC_PROCESS_SINGLE_OP = `INTERFACE if_bgmc_process_single_op PUBLIC.
3030
+ METHODS set_name
3031
+ IMPORTING iv_name TYPE csequence
3032
+ RETURNING VALUE(ro_process) TYPE REF TO if_bgmc_process_single_op.
3033
+ METHODS set_operation
3034
+ IMPORTING io_operation TYPE REF TO if_bgmc_op_single
3035
+ RETURNING VALUE(ro_process) TYPE REF TO if_bgmc_process_single_op.
3036
+ METHODS set_operation_tx_uncontrolled
3037
+ IMPORTING io_operation TYPE REF TO if_bgmc_op_single_tx_uncontr
3038
+ RETURNING VALUE(ro_process) TYPE REF TO if_bgmc_process_single_op.
3039
+ METHODS save_for_execution
3040
+ RETURNING VALUE(ro_process_monitor) TYPE REF TO if_bgmc_process_monitor
3041
+ RAISING cx_bgmc.
3042
+ ENDINTERFACE.
3043
+ `;
3044
+ const IF_BGMC_PROCESS_FACTORY = `INTERFACE if_bgmc_process_factory PUBLIC.
3045
+ METHODS create
3046
+ RETURNING VALUE(ro_process) TYPE REF TO if_bgmc_process_single_op
3047
+ RAISING cx_bgmc.
3048
+ ENDINTERFACE.
3049
+ `;
3050
+ const ZRAP_CL_BGMC_MONITOR = `CLASS zrap_cl_bgmc_monitor DEFINITION PUBLIC FINAL CREATE PUBLIC.
3051
+ PUBLIC SECTION.
3052
+ INTERFACES if_bgmc_process_monitor.
3053
+ METHODS constructor IMPORTING id TYPE string.
3054
+ PRIVATE SECTION.
3055
+ DATA id TYPE string.
3056
+ ENDCLASS.
3057
+
3058
+ CLASS zrap_cl_bgmc_monitor IMPLEMENTATION.
3059
+ METHOD constructor.
3060
+ me->id = id.
3061
+ ENDMETHOD.
3062
+
3063
+ METHOD if_bgmc_process_monitor~get_state.
3064
+ rv_state = zrap_eml=>bgmc_state( id ).
3065
+ ENDMETHOD.
3066
+
3067
+ METHOD if_bgmc_process_monitor~get_process_id.
3068
+ rv_process_id = id.
3069
+ ENDMETHOD.
3070
+ ENDCLASS.
3071
+ `;
3072
+ const ZRAP_CL_BGMC_PROCESS = `CLASS zrap_cl_bgmc_process DEFINITION PUBLIC FINAL CREATE PUBLIC.
3073
+ PUBLIC SECTION.
3074
+ INTERFACES if_bgmc_process_single_op.
3075
+ INTERFACES if_bgmc_process_factory.
3076
+ "! Runs an operation (the kernel calls it after the commit of the LUW that saved the process).
3077
+ CLASS-METHODS zrap_run
3078
+ IMPORTING operation TYPE REF TO object
3079
+ controlled TYPE abap_bool
3080
+ RAISING cx_bgmc_operation.
3081
+ PRIVATE SECTION.
3082
+ DATA name TYPE string.
3083
+ DATA operation TYPE REF TO object.
3084
+ DATA controlled TYPE abap_bool.
3085
+ ENDCLASS.
3086
+
3087
+ CLASS zrap_cl_bgmc_process IMPLEMENTATION.
3088
+ METHOD if_bgmc_process_factory~create.
3089
+ ro_process = NEW zrap_cl_bgmc_process( ).
3090
+ ENDMETHOD.
3091
+
3092
+ METHOD if_bgmc_process_single_op~set_name.
3093
+ name = iv_name.
3094
+ ro_process = me.
3095
+ ENDMETHOD.
3096
+
3097
+ METHOD if_bgmc_process_single_op~set_operation.
3098
+ operation = io_operation.
3099
+ controlled = abap_true.
3100
+ ro_process = me.
3101
+ ENDMETHOD.
3102
+
3103
+ METHOD if_bgmc_process_single_op~set_operation_tx_uncontrolled.
3104
+ operation = io_operation.
3105
+ controlled = abap_false.
3106
+ ro_process = me.
3107
+ ENDMETHOD.
3108
+
3109
+ METHOD if_bgmc_process_single_op~save_for_execution.
3110
+ IF operation IS INITIAL.
3111
+ RAISE EXCEPTION NEW cx_bgmc( zrap_text = \`the process has no operation: set_operation or set_operation_tx_uncontrolled\` ).
3112
+ ENDIF.
3113
+ ro_process_monitor = NEW zrap_cl_bgmc_monitor( zrap_eml=>bgmc_save( operation = operation name = name controlled = controlled ) ).
3114
+ ENDMETHOD.
3115
+
3116
+ METHOD zrap_run.
3117
+ DATA single TYPE REF TO if_bgmc_op_single.
3118
+ DATA uncontrolled TYPE REF TO if_bgmc_op_single_tx_uncontr.
3119
+ IF controlled = abap_true.
3120
+ single ?= operation.
3121
+ single->execute( ).
3122
+ ELSE.
3123
+ uncontrolled ?= operation.
3124
+ uncontrolled->execute( ).
3125
+ ENDIF.
3126
+ ENDMETHOD.
3127
+ ENDCLASS.
3128
+ `;
3129
+ const CL_BGMC_PROCESS_FACTORY = `CLASS cl_bgmc_process_factory DEFINITION PUBLIC FINAL CREATE PRIVATE.
3130
+ PUBLIC SECTION.
3131
+ CLASS-METHODS get_default
3132
+ RETURNING VALUE(ro_factory) TYPE REF TO if_bgmc_process_factory.
3133
+ ENDCLASS.
3134
+
3135
+ CLASS cl_bgmc_process_factory IMPLEMENTATION.
3136
+ METHOD get_default.
3137
+ ro_factory = NEW zrap_cl_bgmc_process( ).
3138
+ ENDMETHOD.
3139
+ ENDCLASS.
3140
+ `;
3141
+ const CL_ABAP_TX = `CLASS cl_abap_tx DEFINITION PUBLIC FINAL CREATE PRIVATE.
3142
+ PUBLIC SECTION.
3143
+ "! Transactional phase of a controlled background operation: database writes after save( ).
3144
+ CLASS-METHODS save.
3145
+ CLASS-METHODS modify.
3146
+ ENDCLASS.
3147
+
3148
+ CLASS cl_abap_tx IMPLEMENTATION.
3149
+ METHOD save.
3150
+ zrap_eml=>tx_phase( \`save\` ).
3151
+ ENDMETHOD.
3152
+
3153
+ METHOD modify.
3154
+ zrap_eml=>tx_phase( \`modify\` ).
3155
+ ENDMETHOD.
3156
+ ENDCLASS.
3157
+ `;
3158
+ // ------------------------------------------------------------------------------ e-mail (D41)
3159
+ const CL_BCS_MAIL_BODYPART = `CLASS cl_bcs_mail_bodypart DEFINITION PUBLIC ABSTRACT CREATE PUBLIC.
3160
+ PUBLIC SECTION.
3161
+ DATA content_type TYPE string READ-ONLY.
3162
+ DATA filename TYPE string READ-ONLY.
3163
+ DATA text TYPE string READ-ONLY.
3164
+ DATA binary TYPE xstring READ-ONLY.
3165
+ DATA is_binary TYPE abap_bool READ-ONLY.
3166
+ METHODS zrap_set
3167
+ IMPORTING content_type TYPE csequence
3168
+ filename TYPE csequence OPTIONAL
3169
+ text TYPE string OPTIONAL
3170
+ binary TYPE xstring OPTIONAL
3171
+ is_binary TYPE abap_bool DEFAULT abap_false.
3172
+ ENDCLASS.
3173
+
3174
+ CLASS cl_bcs_mail_bodypart IMPLEMENTATION.
3175
+ METHOD zrap_set.
3176
+ me->content_type = content_type.
3177
+ me->filename = filename.
3178
+ me->text = text.
3179
+ me->binary = binary.
3180
+ me->is_binary = is_binary.
3181
+ ENDMETHOD.
3182
+ ENDCLASS.
3183
+ `;
3184
+ const CL_BCS_MAIL_TEXTPART = `CLASS cl_bcs_mail_textpart DEFINITION PUBLIC INHERITING FROM cl_bcs_mail_bodypart FINAL CREATE PUBLIC.
3185
+ PUBLIC SECTION.
3186
+ CLASS-METHODS create_instance
3187
+ IMPORTING iv_content TYPE string
3188
+ iv_content_type TYPE string DEFAULT \`text/plain\`
3189
+ iv_filename TYPE string OPTIONAL
3190
+ RETURNING VALUE(ro_instance) TYPE REF TO cl_bcs_mail_textpart
3191
+ RAISING cx_bcs_mail.
3192
+ CLASS-METHODS create_text_plain
3193
+ IMPORTING iv_content TYPE string
3194
+ iv_filename TYPE string OPTIONAL
3195
+ RETURNING VALUE(ro_instance) TYPE REF TO cl_bcs_mail_textpart
3196
+ RAISING cx_bcs_mail.
3197
+ CLASS-METHODS create_text_html
3198
+ IMPORTING iv_content TYPE string
3199
+ iv_filename TYPE string OPTIONAL
3200
+ RETURNING VALUE(ro_instance) TYPE REF TO cl_bcs_mail_textpart
3201
+ RAISING cx_bcs_mail.
3202
+ ENDCLASS.
3203
+
3204
+ CLASS cl_bcs_mail_textpart IMPLEMENTATION.
3205
+ METHOD create_instance.
3206
+ ro_instance = NEW cl_bcs_mail_textpart( ).
3207
+ ro_instance->zrap_set( content_type = iv_content_type filename = iv_filename text = iv_content ).
3208
+ ENDMETHOD.
3209
+
3210
+ METHOD create_text_plain.
3211
+ ro_instance = create_instance( iv_content = iv_content iv_content_type = \`text/plain\` iv_filename = iv_filename ).
3212
+ ENDMETHOD.
3213
+
3214
+ METHOD create_text_html.
3215
+ ro_instance = create_instance( iv_content = iv_content iv_content_type = \`text/html\` iv_filename = iv_filename ).
3216
+ ENDMETHOD.
3217
+ ENDCLASS.
3218
+ `;
3219
+ const CL_BCS_MAIL_BINARYPART = `CLASS cl_bcs_mail_binarypart DEFINITION PUBLIC INHERITING FROM cl_bcs_mail_bodypart FINAL CREATE PUBLIC.
3220
+ PUBLIC SECTION.
3221
+ CLASS-METHODS create_instance
3222
+ IMPORTING iv_content TYPE xstring
3223
+ iv_content_type TYPE string
3224
+ iv_filename TYPE string OPTIONAL
3225
+ RETURNING VALUE(ro_instance) TYPE REF TO cl_bcs_mail_binarypart
3226
+ RAISING cx_bcs_mail.
3227
+ ENDCLASS.
3228
+
3229
+ CLASS cl_bcs_mail_binarypart IMPLEMENTATION.
3230
+ METHOD create_instance.
3231
+ ro_instance = NEW cl_bcs_mail_binarypart( ).
3232
+ ro_instance->zrap_set( content_type = iv_content_type filename = iv_filename binary = iv_content is_binary = abap_true ).
3233
+ ENDMETHOD.
3234
+ ENDCLASS.
3235
+ `;
3236
+ const CL_BCS_MAIL_MESSAGE = `CLASS cl_bcs_mail_message DEFINITION PUBLIC FINAL CREATE PRIVATE.
3237
+ PUBLIC SECTION.
3238
+ TYPES ty_copy TYPE c LENGTH 1.
3239
+ TYPES ty_status TYPE c LENGTH 1.
3240
+ TYPES: BEGIN OF ty_recipient_status,
3241
+ recipient TYPE string,
3242
+ status TYPE ty_status,
3243
+ END OF ty_recipient_status.
3244
+ TYPES tt_status TYPE STANDARD TABLE OF ty_recipient_status WITH EMPTY KEY.
3245
+ CONSTANTS to TYPE ty_copy VALUE 'T'.
3246
+ CONSTANTS cc TYPE ty_copy VALUE 'C'.
3247
+ CONSTANTS bcc TYPE ty_copy VALUE 'B'.
3248
+ "! The id of the mail in rapt_mail once sent.
3249
+ DATA zrap_mail_id TYPE string READ-ONLY.
3250
+ CLASS-METHODS create_instance
3251
+ RETURNING VALUE(ro_mail_message) TYPE REF TO cl_bcs_mail_message
3252
+ RAISING cx_bcs_mail.
3253
+ METHODS set_sender
3254
+ IMPORTING iv_address TYPE csequence
3255
+ RAISING cx_bcs_mail.
3256
+ METHODS set_reply_to
3257
+ IMPORTING iv_address TYPE csequence
3258
+ RAISING cx_bcs_mail.
3259
+ METHODS add_recipient
3260
+ IMPORTING iv_address TYPE csequence
3261
+ iv_copy TYPE ty_copy DEFAULT to
3262
+ RAISING cx_bcs_mail.
3263
+ METHODS set_subject
3264
+ IMPORTING iv_subject TYPE csequence
3265
+ RAISING cx_bcs_mail.
3266
+ METHODS set_main
3267
+ IMPORTING io_main TYPE REF TO cl_bcs_mail_bodypart
3268
+ RAISING cx_bcs_mail.
3269
+ METHODS add_attachment
3270
+ IMPORTING io_attachment TYPE REF TO cl_bcs_mail_bodypart
3271
+ RAISING cx_bcs_mail.
3272
+ METHODS send
3273
+ EXPORTING et_status TYPE tt_status
3274
+ ev_mail_status TYPE ty_status
3275
+ RAISING cx_bcs_mail.
3276
+ METHODS send_async
3277
+ RAISING cx_bcs_mail.
3278
+ TYPES: BEGIN OF zrap_ty_recipient,
3279
+ address TYPE string,
3280
+ kind TYPE ty_copy,
3281
+ END OF zrap_ty_recipient.
3282
+ TYPES: BEGIN OF zrap_ty_part,
3283
+ main TYPE abap_bool,
3284
+ content_type TYPE string,
3285
+ filename TYPE string,
3286
+ text TYPE string,
3287
+ binary TYPE xstring,
3288
+ is_binary TYPE abap_bool,
3289
+ END OF zrap_ty_part.
3290
+ PRIVATE SECTION.
3291
+ DATA sender TYPE string.
3292
+ DATA reply_to TYPE string.
3293
+ DATA subject TYPE string.
3294
+ DATA recipients TYPE STANDARD TABLE OF zrap_ty_recipient WITH EMPTY KEY.
3295
+ DATA parts TYPE STANDARD TABLE OF zrap_ty_part WITH EMPTY KEY.
3296
+ METHODS part
3297
+ IMPORTING part TYPE REF TO cl_bcs_mail_bodypart
3298
+ main TYPE abap_bool
3299
+ RETURNING VALUE(line) TYPE zrap_ty_part.
3300
+ ENDCLASS.
3301
+
3302
+ CLASS cl_bcs_mail_message IMPLEMENTATION.
3303
+ METHOD create_instance.
3304
+ ro_mail_message = NEW cl_bcs_mail_message( ).
3305
+ ENDMETHOD.
3306
+
3307
+ METHOD set_sender.
3308
+ sender = iv_address.
3309
+ ENDMETHOD.
3310
+
3311
+ METHOD set_reply_to.
3312
+ reply_to = iv_address.
3313
+ ENDMETHOD.
3314
+
3315
+ METHOD add_recipient.
3316
+ APPEND VALUE #( address = |{ iv_address }| kind = iv_copy ) TO recipients.
3317
+ ENDMETHOD.
3318
+
3319
+ METHOD set_subject.
3320
+ subject = iv_subject.
3321
+ ENDMETHOD.
3322
+
3323
+ METHOD part.
3324
+ line-main = main.
3325
+ line-content_type = part->content_type.
3326
+ line-filename = part->filename.
3327
+ line-text = part->text.
3328
+ line-binary = part->binary.
3329
+ line-is_binary = part->is_binary.
3330
+ ENDMETHOD.
3331
+
3332
+ METHOD set_main.
3333
+ DELETE parts WHERE main = abap_true.
3334
+ INSERT part( part = io_main main = abap_true ) INTO parts INDEX 1.
3335
+ ENDMETHOD.
3336
+
3337
+ METHOD add_attachment.
3338
+ APPEND part( part = io_attachment main = abap_false ) TO parts.
3339
+ ENDMETHOD.
3340
+
3341
+ METHOD send.
3342
+ DATA recipient TYPE zrap_ty_recipient.
3343
+ zrap_mail_id = zrap_eml=>mail_send( sender = sender
3344
+ reply_to = reply_to
3345
+ subject = subject
3346
+ recipients = recipients
3347
+ parts = parts ).
3348
+ " sent once the LUW is committed
3349
+ ev_mail_status = 'W'.
3350
+ CLEAR et_status.
3351
+ LOOP AT recipients INTO recipient.
3352
+ APPEND VALUE #( recipient = recipient-address status = 'W' ) TO et_status.
3353
+ ENDLOOP.
3354
+ ENDMETHOD.
3355
+
3356
+ METHOD send_async.
3357
+ send( ).
3358
+ ENDMETHOD.
3359
+ ENDCLASS.
3360
+ `;
3361
+ // ------------------------------------------------------------------------------ the kernel
3362
+ /** Methods of ZRAP_EML for the utilities; their bodies are replaced at run time. */
3363
+ export const UTILS_KERNEL_DEFINITIONS = ` "! /ui2/cl_json and xco_cp_json: mode is a pretty_mode of /ui2/cl_json, or xco.
3364
+ CLASS-METHODS json_serialize
3365
+ IMPORTING data TYPE data
3366
+ mode TYPE string OPTIONAL
3367
+ compress TYPE abap_bool DEFAULT abap_false
3368
+ numc_as_string TYPE abap_bool DEFAULT abap_false
3369
+ ts_as_iso8601 TYPE abap_bool DEFAULT abap_false
3370
+ hex_as_base64 TYPE abap_bool DEFAULT abap_true
3371
+ format_output TYPE abap_bool DEFAULT abap_false
3372
+ booleans TYPE abap_bool DEFAULT abap_false
3373
+ mappings TYPE string OPTIONAL
3374
+ RETURNING VALUE(json) TYPE string.
3375
+ CLASS-METHODS json_deserialize
3376
+ IMPORTING json TYPE string
3377
+ mode TYPE string OPTIONAL
3378
+ hex_as_base64 TYPE abap_bool DEFAULT abap_true
3379
+ mappings TYPE string OPTIONAL
3380
+ CHANGING data TYPE data.
3381
+ CLASS-METHODS json_transform
3382
+ IMPORTING json TYPE string
3383
+ kinds TYPE string
3384
+ RETURNING VALUE(result) TYPE string.
3385
+ CLASS-METHODS json_quote
3386
+ IMPORTING text TYPE string
3387
+ RETURNING VALUE(result) TYPE string.
3388
+ CLASS-METHODS codepage_check
3389
+ IMPORTING codepage TYPE string.
3390
+ CLASS-METHODS codepage_out
3391
+ IMPORTING codepage TYPE string
3392
+ source TYPE string
3393
+ RETURNING VALUE(result) TYPE xstring.
3394
+ CLASS-METHODS codepage_in
3395
+ IMPORTING codepage TYPE string
3396
+ source TYPE xstring
3397
+ RETURNING VALUE(result) TYPE string.
3398
+ CLASS-METHODS base64_encode_x
3399
+ IMPORTING data TYPE xstring
3400
+ RETURNING VALUE(result) TYPE string.
3401
+ CLASS-METHODS base64_decode
3402
+ IMPORTING text TYPE string
3403
+ RETURNING VALUE(result) TYPE xstring.
3404
+ "! url, url_unescape, html or rtrim.
3405
+ CLASS-METHODS text_escape
3406
+ IMPORTING format TYPE string
3407
+ text TYPE string
3408
+ RETURNING VALUE(result) TYPE string.
3409
+ "! The characters of a field with its trailing blanks.
3410
+ CLASS-METHODS chars_raw
3411
+ IMPORTING value TYPE c
3412
+ RETURNING VALUE(result) TYPE string.
3413
+ CLASS-METHODS char_code
3414
+ IMPORTING code TYPE i
3415
+ RETURNING VALUE(result) TYPE string.
3416
+ CLASS-METHODS gzip
3417
+ IMPORTING operation TYPE string
3418
+ source TYPE xstring
3419
+ RETURNING VALUE(result) TYPE xstring.
3420
+ CLASS-METHODS digest
3421
+ IMPORTING algorithm TYPE string
3422
+ key TYPE xstring OPTIONAL
3423
+ data TYPE xstring
3424
+ RETURNING VALUE(result) TYPE xstring.
3425
+ CLASS-METHODS random_seed
3426
+ RETURNING VALUE(seed) TYPE i.
3427
+ CLASS-METHODS regex_check
3428
+ IMPORTING pattern TYPE string
3429
+ flags TYPE string.
3430
+ "! The first match from start: offset -1 when none; submatches as "offset,length …".
3431
+ CLASS-METHODS regex_find
3432
+ IMPORTING pattern TYPE string
3433
+ flags TYPE string
3434
+ text TYPE string
3435
+ start TYPE i
3436
+ EXPORTING offset TYPE i
3437
+ length TYPE i
3438
+ submatches TYPE string.
3439
+ CLASS-METHODS regex_replace
3440
+ IMPORTING pattern TYPE string
3441
+ flags TYPE string
3442
+ text TYPE string
3443
+ newtext TYPE string
3444
+ all TYPE abap_bool DEFAULT abap_false
3445
+ EXPORTING count TYPE i
3446
+ RETURNING VALUE(result) TYPE string.
3447
+ CLASS-METHODS date_add
3448
+ IMPORTING date TYPE d
3449
+ years TYPE i DEFAULT 0
3450
+ months TYPE i DEFAULT 0
3451
+ days TYPE i DEFAULT 0
3452
+ RETURNING VALUE(result) TYPE d.
3453
+ CLASS-METHODS moment_add
3454
+ IMPORTING moment TYPE timestamp
3455
+ years TYPE i DEFAULT 0
3456
+ months TYPE i DEFAULT 0
3457
+ days TYPE i DEFAULT 0
3458
+ seconds TYPE i DEFAULT 0
3459
+ RETURNING VALUE(result) TYPE timestamp.
3460
+ CLASS-METHODS unix_time
3461
+ IMPORTING moment TYPE timestamp
3462
+ RETURNING VALUE(result) TYPE int8.
3463
+ CLASS-METHODS tstmp_add
3464
+ IMPORTING tstmp TYPE string
3465
+ seconds TYPE string
3466
+ RETURNING VALUE(result) TYPE timestampl.
3467
+ CLASS-METHODS tstmp_diff
3468
+ IMPORTING tstmp1 TYPE string
3469
+ tstmp2 TYPE string
3470
+ RETURNING VALUE(result) TYPE timestampl.
3471
+ CLASS-METHODS tstmp_to_utclong
3472
+ IMPORTING tstmp TYPE string
3473
+ RETURNING VALUE(result) TYPE utclong.
3474
+ CLASS-METHODS utclong_to_tstmp
3475
+ IMPORTING value TYPE utclong
3476
+ RETURNING VALUE(result) TYPE timestampl.
3477
+ CLASS-METHODS utclong_read
3478
+ IMPORTING text TYPE string
3479
+ RETURNING VALUE(result) TYPE utclong.
3480
+ CLASS-METHODS number_get
3481
+ IMPORTING object TYPE string
3482
+ subobject TYPE string OPTIONAL
3483
+ interval TYPE string
3484
+ toyear TYPE string OPTIONAL
3485
+ quantity TYPE i DEFAULT 1
3486
+ EXPORTING number TYPE string
3487
+ returncode TYPE c
3488
+ returned TYPE i.
3489
+ CLASS-METHODS number_check
3490
+ IMPORTING object TYPE string
3491
+ subobject TYPE string OPTIONAL
3492
+ interval TYPE string
3493
+ toyear TYPE string OPTIONAL
3494
+ number TYPE string
3495
+ EXPORTING returncode TYPE c.
3496
+ CLASS-METHODS bali_save
3497
+ IMPORTING handle TYPE string
3498
+ object TYPE string
3499
+ subobject TYPE string OPTIONAL
3500
+ external_id TYPE string OPTIONAL
3501
+ expiry_date TYPE d OPTIONAL
3502
+ items TYPE ANY TABLE.
3503
+ CLASS-METHODS bali_query
3504
+ IMPORTING handle TYPE string OPTIONAL
3505
+ object TYPE string OPTIONAL
3506
+ subobject TYPE string OPTIONAL
3507
+ external_id TYPE string OPTIONAL
3508
+ user TYPE string OPTIONAL
3509
+ start_time TYPE utclong OPTIONAL
3510
+ end_time TYPE utclong OPTIONAL
3511
+ max_count TYPE i DEFAULT 0
3512
+ CHANGING logs TYPE ANY TABLE.
3513
+ CLASS-METHODS bali_items
3514
+ IMPORTING handle TYPE string
3515
+ CHANGING items TYPE ANY TABLE.
3516
+ CLASS-METHODS bali_delete
3517
+ IMPORTING handle TYPE string.
3518
+ "! RTTS: kind (E S T R), type kind, length (bytes), decimals, absolute name, components of a structure.
3519
+ CLASS-METHODS rtti_describe
3520
+ IMPORTING data TYPE any
3521
+ EXPORTING kind TYPE string
3522
+ type_kind TYPE string
3523
+ length TYPE i
3524
+ decimals TYPE i
3525
+ name TYPE string
3526
+ components TYPE string.
3527
+ CLASS-METHODS class_name
3528
+ IMPORTING object TYPE REF TO object
3529
+ RETURNING VALUE(name) TYPE string.
3530
+ "! bgPF (D41): saves a process in the LUW; it runs after the commit. Returns its id.
3531
+ CLASS-METHODS bgmc_save
3532
+ IMPORTING operation TYPE REF TO object
3533
+ name TYPE string OPTIONAL
3534
+ controlled TYPE abap_bool
3535
+ RETURNING VALUE(id) TYPE string.
3536
+ CLASS-METHODS bgmc_state
3537
+ IMPORTING id TYPE string
3538
+ RETURNING VALUE(state) TYPE string.
3539
+ CLASS-METHODS tx_phase
3540
+ IMPORTING phase TYPE string.
3541
+ "! cl_bcs_mail_message (D41): keeps the mail in the LUW; it is sent after the commit. Returns its id.
3542
+ CLASS-METHODS mail_send
3543
+ IMPORTING sender TYPE string OPTIONAL
3544
+ reply_to TYPE string OPTIONAL
3545
+ subject TYPE string OPTIONAL
3546
+ recipients TYPE ANY TABLE
3547
+ parts TYPE ANY TABLE
3548
+ RETURNING VALUE(id) TYPE string.
3549
+ `;
3550
+ export const UTILS_KERNEL_METHODS = [
3551
+ "json_serialize",
3552
+ "json_deserialize",
3553
+ "json_transform",
3554
+ "json_quote",
3555
+ "codepage_check",
3556
+ "codepage_out",
3557
+ "codepage_in",
3558
+ "base64_encode_x",
3559
+ "base64_decode",
3560
+ "text_escape",
3561
+ "chars_raw",
3562
+ "char_code",
3563
+ "gzip",
3564
+ "digest",
3565
+ "random_seed",
3566
+ "regex_check",
3567
+ "regex_find",
3568
+ "regex_replace",
3569
+ "date_add",
3570
+ "moment_add",
3571
+ "unix_time",
3572
+ "tstmp_add",
3573
+ "tstmp_diff",
3574
+ "tstmp_to_utclong",
3575
+ "utclong_to_tstmp",
3576
+ "utclong_read",
3577
+ "number_get",
3578
+ "number_check",
3579
+ "bali_save",
3580
+ "bali_query",
3581
+ "bali_items",
3582
+ "bali_delete",
3583
+ "rtti_describe",
3584
+ "class_name",
3585
+ "bgmc_save",
3586
+ "bgmc_state",
3587
+ "tx_phase",
3588
+ "mail_send",
3589
+ ];
3590
+ export const UTILS_KERNEL_IMPLEMENTATIONS = UTILS_KERNEL_METHODS.map((m) => ` METHOD ${m}.\n ENDMETHOD.\n`).join("\n");
3591
+ const clas = (name, source) => ({ fileName: `${name.replace(/\//g, "#")}.clas.abap`, source });
3592
+ const intf = (name, source) => ({ fileName: `${name}.intf.abap`, source });
3593
+ /** The utilities, given to the transpiler only when a project uses them (frameworkClosure). */
3594
+ export const UTILS_FRAMEWORK_SOURCES = [
3595
+ ...DDIC,
3596
+ { fileName: "abap.type.abap", source: TYPE_POOL_ABAP },
3597
+ ...EXCEPTIONS,
3598
+ clas("/ui2/cl_json", UI2_CL_JSON),
3599
+ intf("if_xco_cp_json_transformation", IF_XCO_CP_JSON_TRANSFORMATION),
3600
+ clas("zrap_cl_xco_json_trafo", ZRAP_CL_XCO_JSON_TRANSFORMATION),
3601
+ clas("zrap_cl_xco_json_trafos", ZRAP_CL_XCO_JSON_TRAFOS),
3602
+ intf("if_xco_cp_json_data", IF_XCO_CP_JSON_DATA),
3603
+ clas("zrap_cl_xco_json_data", ZRAP_CL_XCO_JSON_DATA),
3604
+ intf("if_xco_cp_json_data_builder", IF_XCO_CP_JSON_DATA_BUILDER),
3605
+ clas("zrap_cl_xco_json_builder", ZRAP_CL_XCO_JSON_BUILDER),
3606
+ intf("if_xco_cp_json_data_factory", IF_XCO_CP_JSON_DATA_FACTORY),
3607
+ clas("zrap_cl_xco_json_factory", ZRAP_CL_XCO_JSON_FACTORY),
3608
+ clas("xco_cp_json", XCO_CP_JSON),
3609
+ clas("cl_web_http_utility", CL_WEB_HTTP_UTILITY),
3610
+ intf("if_abap_conv_out", IF_ABAP_CONV_OUT),
3611
+ intf("if_abap_conv_in", IF_ABAP_CONV_IN),
3612
+ clas("cl_abap_conv_codepage", CL_ABAP_CONV_CODEPAGE),
3613
+ clas("cl_abap_gzip", CL_ABAP_GZIP),
3614
+ clas("cl_abap_char_utilities", CL_ABAP_CHAR_UTILITIES),
3615
+ clas("cl_abap_string_utilities", CL_ABAP_STRING_UTILITIES),
3616
+ clas("zrap_cl_xco_encoding", ZRAP_CL_XCO_ENCODING),
3617
+ clas("zrap_cl_xco_code_pages", ZRAP_CL_XCO_CODE_PAGES),
3618
+ clas("xco_cp_character", XCO_CP_CHARACTER),
3619
+ clas("zrap_cl_xco_text_encodings", ZRAP_CL_XCO_TEXT_ENCODINGS),
3620
+ clas("xco_cp_binary", XCO_CP_BINARY),
3621
+ clas("zrap_cl_xco_string", ZRAP_CL_XCO_STRING),
3622
+ clas("zrap_cl_xco_strings", ZRAP_CL_XCO_STRINGS),
3623
+ clas("zrap_cl_xco_xstring", ZRAP_CL_XCO_XSTRING),
3624
+ clas("zrap_cl_xco_time_format", ZRAP_CL_XCO_TIME_FORMAT),
3625
+ clas("zrap_cl_xco_time_formats", ZRAP_CL_XCO_TIME_FORMATS),
3626
+ clas("zrap_cl_xco_time_zone", ZRAP_CL_XCO_TIME_ZONE),
3627
+ clas("zrap_cl_xco_time_zones", ZRAP_CL_XCO_TIME_ZONES),
3628
+ clas("zrap_cl_xco_date", ZRAP_CL_XCO_DATE),
3629
+ clas("zrap_cl_xco_time", ZRAP_CL_XCO_TIME),
3630
+ clas("zrap_cl_xco_moment", ZRAP_CL_XCO_MOMENT),
3631
+ clas("zrap_cl_xco_unix_timestamp", ZRAP_CL_XCO_UNIX_TIMESTAMP),
3632
+ clas("xco_cp_time", XCO_CP_TIME),
3633
+ clas("zrap_cl_xco_user", ZRAP_CL_XCO_USER),
3634
+ clas("zrap_cl_xco_language", ZRAP_CL_XCO_LANGUAGE),
3635
+ clas("zrap_cl_xco_sy", ZRAP_CL_XCO_SY),
3636
+ clas("xco_cp", XCO_CP),
3637
+ clas("cl_abap_tstmp", CL_ABAP_TSTMP),
3638
+ clas("cl_abap_utclong", CL_ABAP_UTCLONG),
3639
+ clas("cl_numberrange_runtime", CL_NUMBERRANGE_RUNTIME),
3640
+ intf("if_bali_constants", IF_BALI_CONSTANTS),
3641
+ intf("if_bali_item_getter", IF_BALI_ITEM_GETTER),
3642
+ intf("if_bali_item_setter", IF_BALI_ITEM_SETTER),
3643
+ clas("zrap_cl_bali_item", ZRAP_CL_BALI_ITEM),
3644
+ clas("cl_bali_free_text_setter", CL_BALI_FREE_TEXT_SETTER),
3645
+ clas("cl_bali_message_setter", CL_BALI_MESSAGE_SETTER),
3646
+ clas("cl_bali_exception_setter", CL_BALI_EXCEPTION_SETTER),
3647
+ intf("if_bali_header_getter", IF_BALI_HEADER_GETTER),
3648
+ intf("if_bali_header_setter", IF_BALI_HEADER_SETTER),
3649
+ clas("cl_bali_header_setter", CL_BALI_HEADER_SETTER),
3650
+ intf("if_bali_log", IF_BALI_LOG),
3651
+ clas("cl_bali_log", CL_BALI_LOG),
3652
+ intf("if_bali_log_filter", IF_BALI_LOG_FILTER),
3653
+ clas("cl_bali_log_filter", CL_BALI_LOG_FILTER),
3654
+ intf("if_bali_log_db", IF_BALI_LOG_DB),
3655
+ clas("cl_bali_log_db", CL_BALI_LOG_DB),
3656
+ clas("cl_abap_message_digest", CL_ABAP_MESSAGE_DIGEST),
3657
+ clas("cl_abap_hmac", CL_ABAP_HMAC),
3658
+ clas("cl_abap_random", CL_ABAP_RANDOM),
3659
+ ...RANDOM_TYPED,
3660
+ clas("cl_abap_regex", CL_ABAP_REGEX),
3661
+ clas("cl_abap_matcher", CL_ABAP_MATCHER),
3662
+ clas("cl_abap_typedescr", CL_ABAP_TYPEDESCR),
3663
+ ...RTTS,
3664
+ intf("if_bgmc_op_single", IF_BGMC_OP_SINGLE),
3665
+ intf("if_bgmc_op_single_tx_uncontr", IF_BGMC_OP_SINGLE_TX_UNCONTR),
3666
+ intf("if_bgmc_process_monitor", IF_BGMC_PROCESS_MONITOR),
3667
+ intf("if_bgmc_process_single_op", IF_BGMC_PROCESS_SINGLE_OP),
3668
+ intf("if_bgmc_process_factory", IF_BGMC_PROCESS_FACTORY),
3669
+ clas("zrap_cl_bgmc_monitor", ZRAP_CL_BGMC_MONITOR),
3670
+ clas("zrap_cl_bgmc_process", ZRAP_CL_BGMC_PROCESS),
3671
+ clas("cl_bgmc_process_factory", CL_BGMC_PROCESS_FACTORY),
3672
+ clas("cl_abap_tx", CL_ABAP_TX),
3673
+ clas("cl_bcs_mail_bodypart", CL_BCS_MAIL_BODYPART),
3674
+ clas("cl_bcs_mail_textpart", CL_BCS_MAIL_TEXTPART),
3675
+ clas("cl_bcs_mail_binarypart", CL_BCS_MAIL_BINARYPART),
3676
+ clas("cl_bcs_mail_message", CL_BCS_MAIL_MESSAGE),
3677
+ ];
3678
+ /** Name of the object of a framework file: `/ui2/cl_json` for `#ui2#cl_json.clas.abap`. */
3679
+ export function frameworkObjectName(fileName) {
3680
+ return (fileName.split(".")[0] ?? "").replace(/#/g, "/").toLowerCase();
3681
+ }
3682
+ const WORD = /[a-z_/][a-z0-9_/]*/g;
3683
+ /**
3684
+ * The utilities a project needs: those named in its sources, then those they name, and so on.
3685
+ * Words are matched case-insensitively; the type pool ABAP comes with the abap_comp* types.
3686
+ */
3687
+ export function frameworkClosure(sources) {
3688
+ const byName = new Map();
3689
+ for (const source of UTILS_FRAMEWORK_SOURCES) {
3690
+ byName.set(frameworkObjectName(source.fileName), source);
3691
+ }
3692
+ const wanted = new Set();
3693
+ // the DDIC XML of the utilities names other objects only as row and component types
3694
+ const words = (content) => content.startsWith("<?xml") ? [...content.matchAll(/<(?:ROLLNAME|ROWTYPE)>([^<]+)</g)].map((m) => (m[1] ?? "").toLowerCase()) : (content.toLowerCase().match(WORD) ?? []);
3695
+ const queue = sources.map((s) => s.content);
3696
+ while (queue.length > 0) {
3697
+ for (const word of words(queue.pop() ?? "")) {
3698
+ const source = word.startsWith("abap_comp") || word === "abap_abstypename" || word === "abap_typekind" ? byName.get("abap") : word === "abap" ? undefined : byName.get(word);
3699
+ if (source !== undefined && !wanted.has(source)) {
3700
+ wanted.add(source);
3701
+ queue.push(source.source);
3702
+ }
3703
+ }
3704
+ }
3705
+ return UTILS_FRAMEWORK_SOURCES.filter((s) => wanted.has(s));
3706
+ }
3707
+ //# sourceMappingURL=framework-utils.js.map