@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.
- package/LICENSE +21 -0
- package/README.md +21 -2
- package/dist/agent/server.d.ts +35 -0
- package/dist/agent/server.js +408 -0
- package/dist/agent/server.js.map +1 -0
- package/dist/authoring/abapgit.d.ts +38 -0
- package/dist/authoring/abapgit.js +242 -0
- package/dist/authoring/abapgit.js.map +1 -0
- package/dist/authoring/catalog.d.ts +48 -0
- package/dist/authoring/catalog.js +117 -0
- package/dist/authoring/catalog.js.map +1 -0
- package/dist/authoring/floorplan.d.ts +28 -0
- package/dist/authoring/floorplan.js +31 -0
- package/dist/authoring/floorplan.js.map +1 -0
- package/dist/authoring/generate.d.ts +57 -0
- package/dist/authoring/generate.js +630 -0
- package/dist/authoring/generate.js.map +1 -0
- package/dist/authoring/mcp.d.ts +15 -0
- package/dist/authoring/mcp.js +52 -0
- package/dist/authoring/mcp.js.map +1 -0
- package/dist/authoring/new.d.ts +35 -0
- package/dist/authoring/new.js +389 -0
- package/dist/authoring/new.js.map +1 -0
- package/dist/bdef/ast.d.ts +249 -0
- package/dist/bdef/ast.js +3 -0
- package/dist/bdef/ast.js.map +1 -0
- package/dist/bdef/lexer.d.ts +105 -0
- package/dist/bdef/lexer.js +148 -0
- package/dist/bdef/lexer.js.map +1 -0
- package/dist/bdef/parser.d.ts +22 -0
- package/dist/bdef/parser.js +1012 -0
- package/dist/bdef/parser.js.map +1 -0
- package/dist/build.d.ts +26 -0
- package/dist/build.js +62 -0
- package/dist/build.js.map +1 -0
- package/dist/cds/adapter.d.ts +91 -0
- package/dist/cds/adapter.js +381 -0
- package/dist/cds/adapter.js.map +1 -0
- package/dist/cds/expression-ast.d.ts +65 -0
- package/dist/cds/expression-ast.js +330 -0
- package/dist/cds/expression-ast.js.map +1 -0
- package/dist/cli.d.ts +9 -0
- package/dist/cli.js +485 -0
- package/dist/cli.js.map +1 -0
- package/dist/dcl/parser.d.ts +59 -0
- package/dist/dcl/parser.js +338 -0
- package/dist/dcl/parser.js.map +1 -0
- package/dist/ddic/catalog.d.ts +17 -0
- package/dist/ddic/catalog.js +211 -0
- package/dist/ddic/catalog.js.map +1 -0
- package/dist/ddic/cds-types.d.ts +47 -0
- package/dist/ddic/cds-types.js +131 -0
- package/dist/ddic/cds-types.js.map +1 -0
- package/dist/ddic/table-source.d.ts +70 -0
- package/dist/ddic/table-source.js +500 -0
- package/dist/ddic/table-source.js.map +1 -0
- package/dist/ddic/xml.d.ts +65 -0
- package/dist/ddic/xml.js +201 -0
- package/dist/ddic/xml.js.map +1 -0
- package/dist/dev.d.ts +128 -0
- package/dist/dev.js +434 -0
- package/dist/dev.js.map +1 -0
- package/dist/diagnostics.d.ts +33 -0
- package/dist/diagnostics.js +53 -0
- package/dist/diagnostics.js.map +1 -0
- package/dist/gen/abap/derived-types.d.ts +26 -0
- package/dist/gen/abap/derived-types.js +323 -0
- package/dist/gen/abap/derived-types.js.map +1 -0
- package/dist/gen/abap/eml.d.ts +118 -0
- package/dist/gen/abap/eml.js +362 -0
- package/dist/gen/abap/eml.js.map +1 -0
- package/dist/gen/abap/enums.d.ts +13 -0
- package/dist/gen/abap/enums.js +74 -0
- package/dist/gen/abap/enums.js.map +1 -0
- package/dist/gen/abap/framework-http.d.ts +14 -0
- package/dist/gen/abap/framework-http.js +1049 -0
- package/dist/gen/abap/framework-http.js.map +1 -0
- package/dist/gen/abap/framework-query.d.ts +14 -0
- package/dist/gen/abap/framework-query.js +225 -0
- package/dist/gen/abap/framework-query.js.map +1 -0
- package/dist/gen/abap/framework-utils.d.ts +29 -0
- package/dist/gen/abap/framework-utils.js +3707 -0
- package/dist/gen/abap/framework-utils.js.map +1 -0
- package/dist/gen/abap/framework.d.ts +12 -0
- package/dist/gen/abap/framework.js +480 -0
- package/dist/gen/abap/framework.js.map +1 -0
- package/dist/gen/abap/generate.d.ts +40 -0
- package/dist/gen/abap/generate.js +238 -0
- package/dist/gen/abap/generate.js.map +1 -0
- package/dist/gen/abap/rewrite.d.ts +82 -0
- package/dist/gen/abap/rewrite.js +957 -0
- package/dist/gen/abap/rewrite.js.map +1 -0
- package/dist/gen/abap/shadow.d.ts +25 -0
- package/dist/gen/abap/shadow.js +175 -0
- package/dist/gen/abap/shadow.js.map +1 -0
- package/dist/gen/abap/tokens.d.ts +33 -0
- package/dist/gen/abap/tokens.js +87 -0
- package/dist/gen/abap/tokens.js.map +1 -0
- package/dist/gen/app/index.d.ts +25 -0
- package/dist/gen/app/index.js +322 -0
- package/dist/gen/app/index.js.map +1 -0
- package/dist/gen/csdl.d.ts +11 -0
- package/dist/gen/csdl.js +562 -0
- package/dist/gen/csdl.js.map +1 -0
- package/dist/gen/deploy.d.ts +12 -0
- package/dist/gen/deploy.js +53 -0
- package/dist/gen/deploy.js.map +1 -0
- package/dist/gen/docs/index.d.ts +35 -0
- package/dist/gen/docs/index.js +267 -0
- package/dist/gen/docs/index.js.map +1 -0
- package/dist/gen/docs/markdown.d.ts +23 -0
- package/dist/gen/docs/markdown.js +187 -0
- package/dist/gen/docs/markdown.js.map +1 -0
- package/dist/gen/docs/site.d.ts +17 -0
- package/dist/gen/docs/site.js +106 -0
- package/dist/gen/docs/site.js.map +1 -0
- package/dist/gen/keycloak.d.ts +21 -0
- package/dist/gen/keycloak.js +90 -0
- package/dist/gen/keycloak.js.map +1 -0
- package/dist/gen/launchpad/index.d.ts +48 -0
- package/dist/gen/launchpad/index.js +302 -0
- package/dist/gen/launchpad/index.js.map +1 -0
- package/dist/gen/launchpad/ui.d.ts +14 -0
- package/dist/gen/launchpad/ui.js +350 -0
- package/dist/gen/launchpad/ui.js.map +1 -0
- package/dist/gen/mcp.d.ts +23 -0
- package/dist/gen/mcp.js +244 -0
- package/dist/gen/mcp.js.map +1 -0
- package/dist/gen/sql-expressions.d.ts +12 -0
- package/dist/gen/sql-expressions.js +136 -0
- package/dist/gen/sql-expressions.js.map +1 -0
- package/dist/gen/sql.d.ts +38 -0
- package/dist/gen/sql.js +612 -0
- package/dist/gen/sql.js.map +1 -0
- package/dist/gen/ui/index.d.ts +7 -0
- package/dist/gen/ui/index.js +27 -0
- package/dist/gen/ui/index.js.map +1 -0
- package/dist/gen/ui/layout.d.ts +230 -0
- package/dist/gen/ui/layout.js +511 -0
- package/dist/gen/ui/layout.js.map +1 -0
- package/dist/gen/ui/static.d.ts +55 -0
- package/dist/gen/ui/static.js +2901 -0
- package/dist/gen/ui/static.js.map +1 -0
- package/dist/gen/ui/views.d.ts +10 -0
- package/dist/gen/ui/views.js +511 -0
- package/dist/gen/ui/views.js.map +1 -0
- package/dist/gen/vendor.d.ts +23 -0
- package/dist/gen/vendor.js +68 -0
- package/dist/gen/vendor.js.map +1 -0
- package/dist/gen/xml.d.ts +9 -0
- package/dist/gen/xml.js +42 -0
- package/dist/gen/xml.js.map +1 -0
- package/dist/index.d.ts +20 -0
- package/dist/index.js +20 -0
- package/dist/index.js.map +1 -0
- package/dist/input/project.d.ts +50 -0
- package/dist/input/project.js +128 -0
- package/dist/input/project.js.map +1 -0
- package/dist/ir/access-controls.d.ts +11 -0
- package/dist/ir/access-controls.js +148 -0
- package/dist/ir/access-controls.js.map +1 -0
- package/dist/ir/authorizations.d.ts +25 -0
- package/dist/ir/authorizations.js +178 -0
- package/dist/ir/authorizations.js.map +1 -0
- package/dist/ir/behaviors.d.ts +16 -0
- package/dist/ir/behaviors.js +548 -0
- package/dist/ir/behaviors.js.map +1 -0
- package/dist/ir/builder.d.ts +20 -0
- package/dist/ir/builder.js +505 -0
- package/dist/ir/builder.js.map +1 -0
- package/dist/ir/config.d.ts +25 -0
- package/dist/ir/config.js +130 -0
- package/dist/ir/config.js.map +1 -0
- package/dist/ir/dictionary.d.ts +54 -0
- package/dist/ir/dictionary.js +328 -0
- package/dist/ir/dictionary.js.map +1 -0
- package/dist/ir/entities.d.ts +58 -0
- package/dist/ir/entities.js +676 -0
- package/dist/ir/entities.js.map +1 -0
- package/dist/ir/expressions.d.ts +33 -0
- package/dist/ir/expressions.js +327 -0
- package/dist/ir/expressions.js.map +1 -0
- package/dist/ir/handlers.d.ts +63 -0
- package/dist/ir/handlers.js +398 -0
- package/dist/ir/handlers.js.map +1 -0
- package/dist/ir/number-ranges.d.ts +24 -0
- package/dist/ir/number-ranges.js +74 -0
- package/dist/ir/number-ranges.js.map +1 -0
- package/dist/ir/seed.d.ts +23 -0
- package/dist/ir/seed.js +78 -0
- package/dist/ir/seed.js.map +1 -0
- package/dist/ir/service.d.ts +21 -0
- package/dist/ir/service.js +96 -0
- package/dist/ir/service.js.map +1 -0
- package/dist/launchpad/config.d.ts +47 -0
- package/dist/launchpad/config.js +321 -0
- package/dist/launchpad/config.js.map +1 -0
- package/dist/launchpad/workspace.d.ts +48 -0
- package/dist/launchpad/workspace.js +166 -0
- package/dist/launchpad/workspace.js.map +1 -0
- package/dist/srvd/parser.d.ts +36 -0
- package/dist/srvd/parser.js +193 -0
- package/dist/srvd/parser.js.map +1 -0
- package/dist/standard/data.d.ts +18 -0
- package/dist/standard/data.js +534 -0
- package/dist/standard/data.js.map +1 -0
- package/dist/standard/index.d.ts +36 -0
- package/dist/standard/index.js +507 -0
- package/dist/standard/index.js.map +1 -0
- package/dist/version.d.ts +2 -0
- package/dist/version.js +4 -0
- package/dist/version.js.map +1 -0
- package/docs/AGENTS.md +79 -0
- package/docs/ANNOTATIONS.md +76 -0
- package/docs/DECISIONS.md +1554 -0
- package/docs/DEPLOYMENT.md +113 -0
- package/docs/DIAGNOSTICS.md +116 -0
- package/docs/FEATURES.md +287 -0
- package/docs/GUIDE.md +560 -0
- package/docs/KNOWN_GAPS.md +216 -0
- package/docs/MCP.md +84 -0
- package/docs/PLAN.md +690 -0
- package/docs/README.md +148 -0
- package/docs/REMOTE_APIS.md +121 -0
- package/docs/ROADMAP.md +35 -0
- package/docs/UTILITIES.md +95 -0
- 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
|