Sie sind auf Seite 1von 5957

HASH

INFOVERS1
INFODESC 9
CWBNTHEAD h
u 7
NUMM N 10
VERSNO N 4
THEMK C 24
INSTA C 10
MNUMM C 10
MYEAR N 4
INCOMPLETE C 1
INFODATA 8
1
0001835643
0002
BC-FES-BUS

0000
INFODESC 6
CWBNTSTXT h
u 4
NUMM N 10
VERSNO N 4
LANGU C 1
STEXT C 80
INFODATA 16
3
0001835643
0002
D
SAP NWBC ABAP-Laufzeit Patch 29
0001835643
0002
E
SAP NWBC ABAP Runtime Patch 29
0001835643
0002
J
SAP NWBC ABAP 29
INFODESC 10
CWBNTDATA h
v 2
NOTE u 3
NUMM N 10
VERSNO N 4
LANGU C 1
TEXT h
u 2
TDFORMAT C 2
TDLINE C 132
INFODATA 1383
3
0001835643
0002
D
93
>1
UK&NOTE_SYMPTOM&

/
NWBC fr Desktop:

/
Die Navigation von einer Service-Map aus f
unktioniert nicht

ordnungsgem. Der Navigationsmodus ist ni


cht ordnungsgem gesetzt. Das

=
E

/
rgebnis ist z.B. eine In-Place-Navigation,
obwohl eine

Out-of-Place-Navigation erwartet wird.

/
NWBC fr HTML:

/
Es tritt der folgende JavaScript-Fehler au
f: frame[0].id is undefined

/
/
Dieser SAP-Hinweis betrifft SAP NetWeaver
Business Client,

ABAP-Laufzeit:

/
Nach dem Einspielen von SAP-Hinweis 182076
4 (SAP NWBC ABAP Runtime Patch

28) werden Seitenbereiche nicht angezeigt.

/
Der SAP-GUI-Shortcut-Service wurde hinzuge
fgt.

/
Der Kurzdump INITIALIZE_CLIENT bei Verwend
ung von SAP GUI aus NWBC fr

Desktop, wurde behoben.

/
Nach der serverseitigen Aktualisierung des
Navigationsmen-Caches mit

dem Programm NWBC_DELETE_MENU_CACHE werden


alle Benutzer-Client-

/
Puffer automatisch aktualisiert.

>4
UK&NOTE_DESCR&
/

/
SAP NetWeaver Business Client, NWBC

>3
UK&NOTE_SOLUTION&

/
Spielen Sie diesen SAP-Hinweis manuell ein
, oder spielen Sie das

entsprechende Support Package ein.

>2
UK&NOTE_CAUSE&

/
Sie verwenden irgendeine Version und irgen
deinen Typ von NWBC.

AS
*

AS
------------------------------------------
------------------------------

AS
|Manual Activity
|

AS
------------------------------------------
------------------------------

AS
|VALID FOR
|

AS
|Software Component SAP_UI
|

AS
| Release 740 SAPK-74002INSAPUI -
SAPK-74002INSAPUI |

AS
------------------------------------------
------------------------------

G1
Service des Internet Communication Framewo
rks

*
Starten Sie Transaktion SICF (Internet Com
munication Framework). Suchen

Sie den folgenden Service-Pfad: /sap/bc/nw


bc
*
Markieren Sie den Knoten "nwbc", und whle
n Sie im zugehrigen

Kontextmen den Eintrag "Neues Subelement"


.

B1
Name des anzulegenden Serviceelements = nw
bc_sapguilink

B1
Eigenstndiger Service = X

*
Besttigen Sie die Eingaben.

B1
Beschreibung 1 = NWBC-Service zur Generier
ung von SAP GUI-Shortcuts

B1
Paket = SAP_NWBC

B1
Alle anderen Felder behalten ihre Standard
werte.

*
Sichern Sie den Service.

*
*

AS
------------------------------------------
------------------------------

AS
|Manual Activity
|

AS
------------------------------------------
------------------------------

AS
|VALID FOR
|

AS
|Software Component SAP_BASIS
SAP Basiskompon...|

AS
| Release 700 SAPKB70022 - SAPKB7
0028 |

AS
| Release 711 SAPKB71110 - SAPKB7
1111 |

AS
| Release 701 SAPKB70107 - SAPKB7
0113 |

AS
| Release 702 SAPKB70205 - SAPKB7
0213 |

AS
| Release 730 SAPKB73002 - SAPKB7
3009 |
AS
| Release 720 SAPKB72004 - SAPKB7
2007 |

AS
| Release 731 SAPKB73103 - SAPKB7
3107 |

AS
| Release 740 Until SAPKB74001
|

AS
------------------------------------------
------------------------------

G1
Service des Internet Communication Framewo
rks

*
Starten Sie Transaktion SICF (Internet Com
munication Framework). Suchen

Sie den folgenden Service-Pfad: /sap/bc/nw


bc

*
Markieren Sie den Knoten "nwbc", und whle
n Sie im zugehrigen

Kontextmen" den Eintrag "Neues Subelement


".

B1
Name des anzulegenden Serviceelements = nw
bc_sapguilink

B1
Eigenstndiger Service = X
*

*
Besttigen Sie die Eingaben.

B1
Beschreibung 1 = NWBC-Service zur Generier
ung von SAP GUI-Shortcuts

B1
Paket = SAP_NWBC

B1
Alle anderen Felder behalten ihre Standard
werte.

*
Sichern Sie den Service.

0001835643
0002
E
90
>1
UK&NOTE_SYMPTOM&

/
/
NWBC for Desktop:

/
Navigation from a service map does not wor
k properly. The navigation

mode is not set correctly. This results in


e.g. in-place navigati

/
on although out-of-place is expected.

/
NWBC for HTML:

/
JavaScript error occurs: frame[0].id is un
defined

/
NWBC ABAP Runtime:

/
Side panels are not displayed after implem
enting note 1820764 (SAP NWBC

ABAP Runtime Patch 28)

/
SAP GUI Shortcut service added
/
INITIALIZE_CLIENT short dump is fixed, whe
n using SAP GUI native in NWBC

for Desktop

/
Automatic refreshing of the all users clie
nt buffers after server side

refresh of the navigation menu cache with


program NWBC_DELETE_M

/
ENU_CACHE

>3
UK&NOTE_SOLUTION&

/
Either import this note manually or apply
the corresponding support

package.

>4
UK&NOTE_DESCR&
/

/
SAP NetWeaver Business Client

>2
UK&NOTE_CAUSE&

/
You are using NWBC of any version and type
.

AS

AS
------------------------------------------
------------------------------

AS
|Manual Activity
|

AS
------------------------------------------
------------------------------

AS
|VALID FOR
|
AS
|Software Component SAP_UI
|

AS
| Release 740 SAPK-74002INSAPUI -
SAPK-74002INSAPUI |

AS
------------------------------------------
------------------------------

G1
Service of the Internet Communication Fram
ework

*
Start transaction SICF (Internet Communica
tion Frmaework). Search for

this service path: /sap/bc/nwbc

*
Mark the node "nwbc" and select in its con
text menu the entry "New

Sub-Element".

B1
Name of Service Element to Be Created = nw
bc_sapguilink

B1
Independent Service = X

*
*
Confirm.

B1
Description 1 = NWBC service for generatin
g SAP GUI shortcuts

B1
Package = SAP_NWBC

B1
All other fields keep their default values
.

*
Save the service.

AS
------------------------------------------
------------------------------

AS
|Manual Activity
|

AS
------------------------------------------
------------------------------
AS
|VALID FOR
|

AS
|Software Component SAP_BASIS
SAP Basis compo...|

AS
| Release 700 SAPKB70022 - SAPKB7
0028 |

AS
| Release 711 SAPKB71110 - SAPKB7
1111 |

AS
| Release 701 SAPKB70107 - SAPKB7
0113 |

AS
| Release 702 SAPKB70205 - SAPKB7
0213 |

AS
| Release 730 SAPKB73002 - SAPKB7
3009 |

AS
| Release 720 SAPKB72004 - SAPKB7
2007 |

AS
| Release 731 SAPKB73103 - SAPKB7
3107 |

AS
| Release 740 Until SAPKB74001
|

AS
------------------------------------------
------------------------------

*
G1
Service of the Internet Communication Fram
ework

*
Start transaction SICF (Internet Communica
tion Frmaework). Search for

this service path: /sap/bc/nwbc

*
Mark the node "nwbc" and select in its con
text menu the entry "New

Sub-Element".

B1
Name of Service Element to Be Created = nw
bc_sapguilink

B1
Independent Service = X

*
Confirm.

B1
Description 1 = NWBC service for generatin
g SAP GUI shortcuts

B1
Package = SAP_NWBC

B1
All other fields keep their default values
.
*

*
Save the service.

0001835643
0002
J
91
>1
UK&NOTE_SYMPTOM&

/
NetWeaver Business Client (NWBC):

/
HTML NWBC:

/
JavaScript "frame[0].id is undefined"

/
NWBC ABAP :

/
1820764 (SAP NWBC ABAP 28)

/
SAP GUI

/
NWBC SAP GUI

/
INITIALIZE_CLIENT

/
NWBC_DELETE_MENU_CACHE

>4
UK&NOTE_DESCR&

/
SAP NetWeaver Business Client

>3
UK&NOTE_SOLUTION&

>2
UK&NOTE_CAUSE&
/

/
NWBC

AS

AS
------------------------------------------
------------------------------

AS
|Manual Activity
|

AS
------------------------------------------
------------------------------

AS
|VALID FOR
|

AS
|Software Component SAP_UI
|

AS
| Release 740 SAPK-74002INSAPUI -
SAPK-74002INSAPUI |

AS
------------------------------------------
------------------------------

*
G1

*
SICF ()

/
: /sap/bc/nwbc

*
"nwbc" "

/
Element"

B1
: = nwbc_sapguilink

B1
= X

B1
1 = SAP GUI NWBC

B1
= SAP_NWBC

B1

AS
------------------------------------------
------------------------------

AS
|Manual Activity
|

AS
------------------------------------------
------------------------------

AS
|VALID FOR
|

AS
|Software Component SAP_BASIS
SAP Basis compo...|

AS
| Release 700 SAPKB70022 - SAPKB7
0028 |

AS
| Release 711 SAPKB71110 - SAPKB7
1111 |
AS
| Release 701 SAPKB70107 - SAPKB7
0113 |

AS
| Release 702 SAPKB70205 - SAPKB7
0213 |

AS
| Release 730 SAPKB73002 - SAPKB7
3009 |

AS
| Release 720 SAPKB72004 - SAPKB7
2007 |

AS
| Release 731 SAPKB73103 - SAPKB7
3107 |

AS
| Release 740 Until SAPKB74001
|

AS
------------------------------------------
------------------------------

G1

*
SICF ()

/
: /sap/bc/nwbc

*
"nwbc" "
/
Element"

B1
: = nwbc_sapguilink

B1
= X

B1
1 = SAP GUI NWBC

B1
= SAP_NWBC

B1

*
INFODESC 6
CWBNTVALID h
u 4
NUMM N 10
VERSNO N 4
DEPAKID_V C 10
DEALEID_V N 10
INFODATA 37
9
0001835643
0002
15108
0000000001
0001835643
0002
41
0000000262
0001835643
0002
41
0000000377
0001835643
0002
41
0000000378
0001835643
0002
41
0000000392
0001835643
0002
41
0000000393
0001835643
0002
41
0000000416
0001835643
0002
41
0000000454
0001835643
0002
41
0000000714
INFODESC 8
CWBNTCI h
u 6
NUMM N 10
VERSNO N 4
CIINSTA C 10
CIPAKID C 10
CIALEID N 10
CIVERSNO N 4
INFODATA 43
7
0001835643
0002
0120031469
41
0001233226
0003
0001835643
0002
0120031469
41
0001232980
0002
0001835643
0002
0120031469
41
0001232730
0003
0001835643
0002
0120031469
41
0001232874
0004
0001835643
0002
0120031469
15108
0001233342
0001
0001835643
0002
0120031469
15108
0001233230
0002
0001835643
0002
0120031469
41
0001233265
0002
INFODESC 6
CWBNTGATTR h
u 4
NUMM N 10
VERSNO N 4
ID C 10
VALUE C 64
INFODATA 26
5
0001835643
0002
MASTERLANG
E
0001835643
0002
NT_CATEG
A
0001835643
0002
NT_STATUS
00
0001835643
0002
POST_PROC
X
0001835643
0002
SAP_STATUS
00
INFODESC 10
CWBCIHEAD h
u 8
INSTA C 10
PAKID C 10
ALEID N 10
VERSNO N 4
FORMAT_ID I 4
INCOMPLETE C 1
MANUAL_ACTIVITY C 1
IS_TRANSPORTABLE C 1
INFODATA 57
7
0120031469
41
0001233226
0003
3
C

0120031469
41
0001232980
0002
3
C

0120031469
41
0001232730
0003
3
C

0120031469
41
0001232874
0004
3
C

0120031469
15108
0001233342
0001
3
C
X
0120031469
15108
0001233230
0002
3
C

0120031469
41
0001233265
0002
3
C
X
INFODESC 41
CWBCIDATA h
v 2
CIHEAD u 4
INSTA C 10
PAKID C 10
ALEID N 10
VERSNO N 4
DELTAS h
v 3
HEADER u 2
OLD u 5
PGMID C 4
OBJTYPE C 4
OBJNAME C 120
VERSNO N 5
DESTINATION C 72
NEW u 5
PGMID C 4
OBJTYPE C 4
OBJNAME C 120
VERSNO N 5
DESTINATION C 72
STATEMENT_PATTERNS h
h
C 30
CODE_BLOCK_DELTAS h
v 2
ID h
C 30
ELEMENTARY_DELTAS h
v 4
LINNO I 4
CONTEXT h
u 1
LINE C 255
DELETE h
u 1
LINE C 255
INSERT h
u 1
LINE C 255
INFODATA 71586
7
0120031469
41
0001233226
0003
3
LIMU
CINC
CL_NWBC_HTTP==================CCIMP

00007

LIMU
CINC
CL_NWBC_HTTP==================CCIMP

00000

31
1
\\\\\no_empty_blocks/////
1
\\\\\comments_ignored/////
1
\\\\\delta_normalized/////
3
\\\\\allowed/////
FORM
*
3
\\\\\allowed/////
FUNCTION
*
3
\\\\\allowed/////
MODULE
**
3
\\\\\allowed/////
REPORT
*
3
\\\\\allowed/////
PROGRAM
*
3
\\\\\allowed/////
FUNCTION-POOL
*
3
\\\\\allowed/////
AT
LINE-SELECTION
3
\\\\\allowed/////
AT
USER-COMMAND
4
\\\\\allowed/////
AT
SELECTION-SCREEN
**
3
\\\\\allowed/////
AT
PF*
2
\\\\\allowed/////
INITIALIZATION
2
\\\\\allowed/////
START-OF-SELECTION
2
\\\\\allowed/////
END-OF-SELECTION
3
\\\\\allowed/////
TOP-OF-PAGE
**
2
\\\\\allowed/////
END-OF-PAGE
3
\\\\\allowed/////
GET
**
3
\\\\\forbidden/////
GET
BADI
3
\\\\\forbidden/////
GET
BIT
3
\\\\\forbidden/////
GET
CONNECTION
3
\\\\\forbidden/////
GET
CURSOR
3
\\\\\forbidden/////
GET
DATASET
3
\\\\\forbidden/////
GET
LOCALE
3
\\\\\forbidden/////
GET
PARAMETER
3
\\\\\forbidden/////
GET
PF-STATUS
3
\\\\\forbidden/////
GET
PROPERTY
3
\\\\\forbidden/////
GET
REFERENCE
3
\\\\\forbidden/////
GET
RUN
3
\\\\\forbidden/////
GET
TIME
1
0
3
2
1

6
*-----------------------------------------
-----------------------------*

* CLASS lcl_http_base_handler DEFINI


TION

*-----------------------------------------
-----------------------------*

*
*-----------------------------------------
-----------------------------*

CLASS lcl_http_base_handler DEFINITION ABS


TRACT.

289
**----------------------------------------
------------------------------*

** CLASS lcl_http DEFINITION

**----------------------------------------
------------------------------*

*CLASS lcl_http DEFINITION.

* PUBLIC SECTION.

* METHODS:
* constructor IMPORTING server TYPE R
EF TO if_http_server,

* html IMPORTING data TYPE string,

* xml IMPORTING data TYPE xstring

* cdata TYPE csequence


OPTIONAL

* type TYPE st
ring DEFAULT 'text/xml' "#EC NOTEXT

* value(charset) TYPE
csequence OPTIONAL

* PREFERRED PARAMETER
data,

* ff IMPORTING name TYPE string

* accept TYPE string


OPTIONAL
* reject TYPE string
OPTIONAL

* upper TYPE abap_bo


ol DEFAULT abap_false

* default TYPE string


OPTIONAL

* RETURNING VALUE(ff) TYPE strin


g,

* ffs IMPORTING name TYPE string


OPTIONAL

* accept TYPE string


OPTIONAL

* reject TYPE string


OPTIONAL

* upper TYPE abap_bo


ol DEFAULT abap_false

* only_post_body TYPE
abap_bool DEFAULT abap_false

* RETURNING VALUE(ffs) TYPE tiht


tpnvp.

* DATA:

* server TYPE REF TO if_http_server


,

* request TYPE REF TO if_http_reques


t,

* response TYPE REF TO if_http_respon


se.

*ENDCLASS. "lcl_http DE
FINITION

*
*

**----------------------------------------
------------------------------*

** CLASS lcl_http IMPLEMENTATION

**----------------------------------------
------------------------------*

*CLASS lcl_http IMPLEMENTATION.

* METHOD constructor.

* me->server = server.
* me->request = server->request.

* me->response = server->response.

* ENDMETHOD. "construc
tor

* METHOD html.

* server->set_compression( EXCEPTIONS O
THERS = 99 ).

* server->response->set_status( code =
200 reason = `OK` ).
"#EC NOTEXT

* server->response->set_header_field( n
ame = if_http_header_fields=>cache_contro
l value = 'no-store, no-cache, must-revali
date' ). "#EC NOTEXT
* server->response->set_header_field( n
ame = if_http_header_fields=>pragma value
= 'no-cache' ).
"#EC NOTEXT

* server->response->set_header_field( n
ame = if_http_header_fields=>expires valu
e = '0' ).

* server->response->set_header_field( n
ame = if_http_header_fields=>content_type
value = `text/html` ).
"#EC NOTEXT

* server->response->set_cdata( data ).

* ENDMETHOD. "html

* METHOD xml.

* DATA : content_type TYPE string.

* content_type = type.
* server->set_compression( EXCEPTIONS O
THERS = 99 ).

* server->response->set_status( code =
200 reason = `OK` ).
"#EC NOTEXT

* server->response->set_header_field( n
ame = if_http_header_fields=>cache_contro
l value = 'no-store, no-cache, must-revali
date' ). "#EC NOTEXT

* server->response->set_header_field( n
ame = if_http_header_fields=>pragma value
= 'no-cache' ).
"#EC NOTEXT

* server->response->set_header_field( n
ame = if_http_header_fields=>expires valu
e = '0' ).

* IF data IS SUPPLIED.

* CONCATENATE content_type `; charset


=utf-8` INTO content_type. "#EC NOTEXT

* server->response->set_header_field(
name = if_http_header_fields=>content_ty
pe value = content_type ). "#EC NOTEXT
* server->response->set_data( data ).

* ELSE.

* DATA: default_charset(255) TYPE c.

* IF charset IS SUPPLIED AND charset


= sy-langu.

* CALL FUNCTION 'SCP_CODEPAGE_INFO'

* IMPORTING

* http_name = default_charset.

* CONCATENATE content_type `; chars


et=` default_charset INTO content_type. "#
EC NOTEXT

* ELSEIF charset IS SUPPLIED.


* CONCATENATE content_type `; chars
et=` charset INTO content_type. "#EC NOTEX
T

* ELSE.

* CONCATENATE content_type `; chars


et=utf-8` INTO content_type. "#EC NOTEXT

* ENDIF.

* server->response->set_header_field(
name = if_http_header_fields=>content_ty
pe value = content_type ).

* server->response->set_cdata( cdata
).

* ENDIF.

* ENDMETHOD. "xml

*
* METHOD ff.

*" query = http->ff( name = 'query' acce


pt = 'A-Z0-9*/' ).

* ff = server->request->get_form_field(
name = name ).

* IF upper IS SUPPLIED AND upper = abap


_true.

* TRANSLATE ff TO UPPER CASE. "#EC SY


NTCHAR

* ENDIF.

* IF accept IS SUPPLIED AND accept IS


NOT INITIAL.

* DATA: characters TYPE string.


* characters = accept.

* REPLACE '0-9' IN characters WITH '


0123456789'.

* REPLACE 'a-z' IN characters WITH '


abcdefghijklmnopqrstuvwxyz'. "#EC NOTEXT

* REPLACE 'A-Z' IN characters WITH '


ABCDEFGHIJKLMNOPQRSTUVWXYZ'. "#EC NOTEXT

* IF ff CN characters. " contains NOT


only

* CLEAR ff.

* ENDIF.

* ENDIF.

* IF reject IS SUPPLIED AND reject IS


NOT INITIAL.
* characters = reject.

* REPLACE '0-9' IN characters WITH '


0123456789'.

* REPLACE 'a-z' IN characters WITH '


abcdefghijklmnopqrstuvwxyz'. "#EC NOTEXT

* REPLACE 'A-Z' IN characters WITH '


ABCDEFGHIJKLMNOPQRSTUVWXYZ'. "#EC NOTEXT

* IF ff CA characters. " contains any

* CLEAR ff.

* ENDIF.

* ENDIF.
* IF default IS SUPPLIED AND ff IS INIT
IAL.

* ff = default.

* ENDIF.

* ENDMETHOD. "ff

* METHOD ffs.

* FIELD-SYMBOLS: <ff> LIKE LINE OF ffs.

*
* IF only_post_body = abap_false.

* server->request->get_form_fields( C
HANGING fields = ffs ).

* ELSE.

* DATA: body TYPE string.

* body = server->request->get_cdata(
).

* ffs = cl_http_utility=>string_to_fi
elds( string = body ).

* ENDIF.

*
* IF name IS SUPPLIED.

* LOOP AT ffs ASSIGNING <ff>.

* IF <ff>-name NS name OR strlen( <


ff>-name ) <> strlen( name ).

* DELETE ffs.

* ENDIF.

* ENDLOOP.

* ENDIF.

* IF upper IS SUPPLIED AND upper = abap


_true.
* LOOP AT ffs ASSIGNING <ff>.

* TRANSLATE <ff>-value TO UPPER CAS


E. "#EC SYNTCHAR

* ENDLOOP.

* ENDIF.

* IF accept IS SUPPLIED AND accept IS


NOT INITIAL.

* DATA: characters TYPE string.

* characters = accept.

* REPLACE '0-9' IN characters WITH '


0123456789'.

* REPLACE 'a-z' IN characters WITH '


abcdefghijklmnopqrstuvwxyz'.

* REPLACE 'A-Z' IN characters WITH '


ABCDEFGHIJKLMNOPQRSTUVWXYZ'.

* LOOP AT ffs ASSIGNING <ff>.

* IF <ff>-value CN characters. " co


ntains NOT only

* DELETE ffs.

* ENDIF.

* ENDLOOP.

* ENDIF.
* IF reject IS SUPPLIED AND reject IS
NOT INITIAL.

* characters = reject.

* REPLACE '0-9' IN characters WITH '


0123456789'.

* REPLACE 'a-z' IN characters WITH '


abcdefghijklmnopqrstuvwxyz'.

* REPLACE 'A-Z' IN characters WITH '


ABCDEFGHIJKLMNOPQRSTUVWXYZ'.

* LOOP AT ffs ASSIGNING <ff>.

* IF <ff>-value CA characters. " co


ntains any

* DELETE ffs.

* ENDIF.
* ENDLOOP.

* ENDIF.

* ENDMETHOD. "ffs

*ENDCLASS. "lcl_http IM
PLEMENTATION

*
*

**----------------------------------------
------------------------------*

** CLASS lcl_html DEFINITION

**

** What this class does, is takes a sequen


ce of HTML in this format below

** and converts to final HTML.

**
** ` <html>`

** `[LINE] <body onload="{handler}">`

**

** In this sequence, [token] must start in


position 1 and marks any

** sequence of lines of been "repeatable".


Everytime that this line

** is token replaced, it is repeated. Actu


al tokens are in {token} format.

**----------------------------------------
------------------------------*

*CLASS lcl_html DEFINITION INHERITING FROM


lcl_http.
* PUBLIC SECTION.

* METHODS:

* clear,

* src IMPORTING VALUE(code) T


YPE string,

* render,

* token_all IMPORTING token TYPE st


ring value TYPE string,

* token_one IMPORTING line TYPE str


ing token TYPE string value TYPE string,

* token_nvp IMPORTING line TYPE str


ing nvp TYPE ihttpnvp.

* CONSTANTS:
* crlf TYPE string VALUE cl_ab
ap_char_utilities=>cr_lf.

* PRIVATE SECTION.

* DATA:

* tbl TYPE tihttpnvp,

* indent TYPE i VALUE 0.

*ENDCLASS.

*
**----------------------------------------
------------------------------*

** CLASS lcl_http IMPLEMENTATION

**----------------------------------------
------------------------------*

*CLASS lcl_html IMPLEMENTATION.

* METHOD clear.

* CLEAR: tbl, indent.

* ENDMETHOD.
*

* METHOD src.

* IF tbl IS INITIAL.

* WHILE code(1) = ` `.

* indent = indent + 1.

* code = code+1.

* ENDWHILE.

* DO indent TIMES.

* CONCATENATE ` ` code INTO code.


* ENDDO.

* ENDIF.

* DATA: line LIKE LINE OF tbl.

* line-value = code.

* line-name = line-value(indent).

* CONCATENATE crlf line-value+indent IN


TO line-value.

* CONDENSE line-name NO-GAPS.

* IF line-name IS NOT INITIAL AND lines


( tbl ) IS NOT INITIAL.
* FIELD-SYMBOLS: <line> LIKE LINE OF
tbl.

* DATA: last_line TYPE i. last_line =


lines( tbl ).

* READ TABLE tbl INDEX last_line ASSI


GNING <line>.

* IF <line>-name = line-name.

* CONCATENATE <line>-value line-val


ue INTO <line>-value.

* RETURN. " <-- RETURN

* ENDIF.

* ENDIF.

* APPEND line TO tbl.


* ENDMETHOD.

* METHOD render.

* DATA: html TYPE string.

* FIELD-SYMBOLS: <line> LIKE LINE OF tb


l.

* LOOP AT tbl ASSIGNING <line> WHERE na


me IS INITIAL.

* CONCATENATE html <line>-value INTO


html.

* ENDLOOP.
* html = html+2. " get rid of leading c
rlf

* me->html( html ).

* ENDMETHOD.

* METHOD token_all.

* FIELD-SYMBOLS: <line> LIKE LINE OF tb


l.

* LOOP AT tbl ASSIGNING <line>.

* REPLACE ALL OCCURRENCES OF token IN


<line>-value WITH value IGNORING CASE.

* ENDLOOP.
* ENDMETHOD.

* METHOD token_one.

* DATA: old_line LIKE LINE OF tbl.

* FIELD-SYMBOLS: <new_line> LIKE LINE O


F tbl.

* LOOP AT tbl INTO old_line WHERE name


= line.

* INSERT old_line INTO tbl INDEX sy-t


abix ASSIGNING <new_line>.

* CLEAR <new_line>-name.

* REPLACE ALL OCCURRENCES OF token IN


<new_line>-value WITH value IGNORING CASE
.

* ENDLOOP.

* ENDMETHOD.

* METHOD token_nvp.

* DATA: old_line LIKE LINE OF tbl.

* FIELD-SYMBOLS: <new_line> LIKE LINE O


F tbl.

* LOOP AT tbl INTO old_line WHERE name


= line.

* INSERT old_line INTO tbl INDEX sy-t


abix ASSIGNING <new_line>.
* CLEAR <new_line>-name.

* REPLACE ALL OCCURRENCES OF '{name}'


IN <new_line>-value WITH nvp-name IGNOR
ING CASE.

* REPLACE ALL OCCURRENCES OF '{value}


' IN <new_line>-value WITH nvp-value IGNOR
ING CASE.

* ENDLOOP.

* ENDMETHOD.

*ENDCLASS.
*-----------------------------------------
-----------------------------*

* CLASS lcl_http_base_handler DEFINI


TION

*-----------------------------------------
-----------------------------*

*-----------------------------------------
-----------------------------*

CLASS lcl_http_base_handler DEFINITION ABS


TRACT.
128
3
ELSE.

DATA: lo_handler TYPE REF TO lcl_h


ttp_base_handler.

1
CREATE OBJECT lo_handler TYPE (lv_
class)

3
CREATE OBJECT lo_handler

TYPE

(lv_class)

320
4
register( iv_name = 'roles' iv_descrip
tion = 'Roles Services' iv_class = 'lcl_ht
tp_atom_role_handler' iv_method = 'execute
'). "#EC NOTEXT
ENDMETHOD. "construct
or

ENDCLASS. "lcl_http_ato
m_handler IMPLEMENTATION

0
908

*-----------------------------------------
-----------------------------*

* CLASS lcl_abap_codepage DEFINITION

*-----------------------------------------
-----------------------------*

* Fallback as CL_ABAP_CODEPAGE does not ex


ist in SAP_BASIS 700
*-----------------------------------------
-----------------------------*

CLASS lcl_abap_codepage DEFINITION FINAL.

PUBLIC SECTION.

CLASS-METHODS:

convert_to

IMPORTING

!source TYPE string

!codepage TYPE string D


EFAULT `UTF-8`

value(endian) TYPE abap_end


ian OPTIONAL
value(replacement) TYPE abap_rep
l DEFAULT '#'

value(ignore_cerr) TYPE abap_boo


l DEFAULT abap_false

RETURNING

value(result) TYPE xstring

RAISING

cx_parameter_invalid_range

cx_sy_codepage_converter_init

cx_sy_conversion_codepage
cx_parameter_invalid_type

sap_codepage

IMPORTING

!codepage TYPE string

RETURNING

value(sapcp) TYPE cpcodepage

RAISING

cx_parameter_invalid
.

ENDCLASS. "lcl_abap_cod
epage DEFINITION

*-----------------------------------------
-----------------------------*

* CLASS lcl_abap_codepage IMPLEMENTA


TION

*-----------------------------------------
-----------------------------*

*-----------------------------------------
-----------------------------*

CLASS lcl_abap_codepage IMPLEMENTATION.


METHOD convert_to.

* convert source to result using codepag


e

DATA: c2x TYPE REF TO cl_abap_conv_ou


t_ce,

scp TYPE abap_encod.

scp = sap_codepage( codepage ).

c2x = cl_abap_conv_out_ce=>create( enc


oding = scp

endian = endian replacement =


replacement

ignore_cerr = ignore_cerr ).
c2x->convert( EXPORTING data = sourc
e

IMPORTING buffer = resul


t ).

ENDMETHOD. "convert_t
o

"convert_to

METHOD sap_codepage.

IF codepage IS INITIAL.

* return current codepage

CALL FUNCTION 'SCP_GET_CODEPAGE_NUMB


ER'

EXPORTING
database_also = space

IMPORTING

appl_codepage = sapcp

EXCEPTIONS

OTHERS = 1.

IF sy-subrc <> 0.

CLEAR sapcp.

ENDIF.
ELSE.

* seach http codepages

DATA: name TYPE string. name = codep


age.

TRANSLATE name TO UPPER CASE.

CALL FUNCTION 'SCP_CODEPAGE_BY_EXTER


NAL_NAME'

EXPORTING

external_name = name

kind = 'H'

IMPORTING
sap_codepage = sapcp

EXCEPTIONS

not_found = 1

OTHERS = 2.

IF sy-subrc = 0. EXIT. ENDIF.

* seach java codepages

CALL FUNCTION 'SCP_CODEPAGE_BY_EXTER


NAL_NAME'

EXPORTING
external_name = name

kind = 'J'

IMPORTING

sap_codepage = sapcp

EXCEPTIONS

not_found = 1

OTHERS = 2.

IF sy-subrc = 0. EXIT. ENDIF.

IF codepage = 'UTF-16'.
* assume platform byte order

IF cl_abap_char_utilities=>endian
= 'L'.

sapcp = sap_codepage( `UTF-16LE`


).

ELSE.

sapcp = sap_codepage( `UTF-16BE`


).

ENDIF.

ELSE.

* raise exception, unknown codepage

RAISE EXCEPTION TYPE cx_parameter_


invalid_range

EXPORTING parameter = 'CODEP


AGE' value = codepage.

ENDIF.

ENDIF.

ENDMETHOD. "sap_codep
age

ENDCLASS. "lcl_abap_cod
epage IMPLEMENTATION

*
**----------------------------------------
------------------------------*

** CLASS lcl_testcase DEFINITION

**----------------------------------------
------------------------------*

*CLASS lcl_testcase DEFINITION INHERITING


FROM lcl_html.

* PUBLIC SECTION.

* METHODS:

* constructor IMPORTING server


TYPE REF TO if_http_server nwbc_runtime TY
PE REF TO if_nwbc_runtime,

* id IMPORTING VALUE(text)
TYPE string,

* title IMPORTING VALUE(text)


TYPE string,
* overview IMPORTING VALUE(text)
TYPE string,

* do IMPORTING VALUE(text)
TYPE string,

* observe IMPORTING VALUE(text)


TYPE string,

* repeat IMPORTING VALUE(text)


TYPE string,

* field IMPORTING name TYPE st


ring value TYPE csequence OPTIONAL,

* button IMPORTING name TYPE st


ring value TYPE string,

* raw_html IMPORTING VALUE(code)


TYPE string,

* javascript IMPORTING function TYP


E string OPTIONAL code TYPE string.
* DATA:

* nwbc_runtime TYPE REF TO if_nwbc_ru


ntime.

*ENDCLASS.

**----------------------------------------
------------------------------*

** CLASS lcl_testcase IMPLEMENTATION


**----------------------------------------
------------------------------*

*CLASS lcl_testcase IMPLEMENTATION.

* METHOD constructor.

* super->constructor( server ).

* server->stateful = 0. " drop the test


case session immediately afterwards

* me->nwbc_runtime = nwbc_runtime.

*
** Complete HTML document

* DEFINE emit. me->src( &1 ). END-OF-


DEFINITION.

* emit:

* ` <!DOCTYPE html>`,

* ` <html>`,

* ` <header>`,

* ` <title>{testcase-id}</title>
`,

* ` </header>`,

* ` <!--`,
* ` testcase:`,

* ` ATTRIBUTES:`,

* `FLD .{name}`,
"#EC NOTEXT

* ` METHODS:`,

* ` .get(name)`,

* ` .set(name,value)`,

* `JSF .{name}`,
"#EC NOTEXT

* `BTN .fire{name}()`,
"#EC NOTEXT

* ` -->`,
* ` <body>`,

* ` <script>`,

* ` function pro54_relax()`,

* ` {`,

* ` var hostname=location.ho
stname,nameparts=hostname.split("."),parts
length=nameparts.length,reference="parent"
;`,

* ` if(/^(\d|\.)+$/.test(hos
tname)) return true;`,

* ` if(partslength==1) retur
n true;`,

* ` var maxrelax=2;`,
* ` if(nameparts[partslength
-1]=="") maxrelax+=1;`,

* ` if(partslength<=maxrelax
) return true;`,

* ` try{`,

* ` document.domain=namepa
rts.slice(1).join(".");`,

* ` return true;`,

* ` }`,

* ` catch(e){`,

* ` return false;`,

* ` }`,
* ` }`,

* ` pro54_relax();`,

* ` </script>`,

* ` <script>`,

* ` var testcase = {};`,

* ` </script>`,

* ` <script>`,

* `FLD testcase.{name} = "{value}


";`,
"#EC NOTEXT
* ` function testcase.XmlReque
st(url) {`,
"#EC NOTEXT

* ` var oXmlHttpRequest = nu
ll; `,
"#EC NOTEXT

* ` if(window.XMLHttpRequest
) { `,
"#EC NOTEXT

* ` oXmlHttpRequest = new
XMLHttpRequest() `,
"#EC NOTEXT

* ` } `,
"#EC NOTEXT

* ` else { `,
"#EC NOTEXT

* ` try{ `,
"#EC NOTEXT

* ` oXmlHttpRequest = ne
w ActiveXObject("Msxml2.XMLHTTP"); `,
"#EC NOTEXT

* ` } `,
"#EC NOTEXT
* ` catch(e){ `,
"#EC NOTEXT

* ` oXmlHttpRequest = ne
w ActiveXObject("Microsoft.XMLHTTP"); `,
"#EC NOTEXT

* ` } `,
"#EC NOTEXT

* ` } `,
"#EC NOTEXT

* ` if(oXmlHttpRequest == nu
ll) return null; `,
"#EC NOTEXT

* ` oXmlHttpRequest.open("GE
T", url, false); `,
"#EC NOTEXT

* ` oXmlHttpRequest.send();`
,
"#EC NOTEXT

* ` return oXmlHttpRequest.r
esponseXML; `,
"#EC NOTEXT
* ` }`,
"#EC NOTEXT

* ` function testcase.addButto
n(name, onclick) {`,
"#EC NOTEXT

* ` inputfield = document.cr
eateElement("input");`,
"#EC NOTEXT

* ` inputfield.setAttribute(
"type", "submit");`,
"#EC NOTEXT

* ` inputfield.setAttribute(
"value", name);`,
"#EC NOTEXT

* ` inputfield.onclick = fun
ction() { eval(onclick); return false; }`,
"#EC NOTEXT

* ` document.all.buttons.app
endChild(inputfield);`,
"#EC NOTEXT

* ` }`,
"#EC NOTEXT

* ` function testcase.triggerR
oundTrip() {`,
"#EC NOTEXT
* ` for(name in testcase) if
(typeof testcase[name] != 'function') {`,
"#EC NOTEXT

* ` inputfield = document.
createElement("input");`,
"#EC NOTEXT

* ` inputfield.setAttribut
e("type", "hidden");`,
"#EC NOTEXT

* ` inputfield.setAttribut
e("name", name);`,
"#EC NOTEXT

* ` inputfield.setAttribut
e("value", testcase[name]);`,
"#EC NOTEXT

* ` document.forms[0].appe
ndChild(inputfield);`,
"#EC NOTEXT

* ` }`,
"#EC NOTEXT

* ` document.forms[0].submit
();`,
"#EC NOTEXT

* ` }`,
"#EC NOTEXT

* ` function testcase.get(name
) {`,
"#EC NOTEXT

* ` try {`,
"#EC NOTEXT

* ` return testcase[name];
`,
"#EC NOTEXT

* ` } catch(e) {}`,
"#EC NOTEXT

* ` return "";`,
"#EC NOTEXT

* ` }`,
"#EC NOTEXT

* ` function testcase.set(name
,value) {`,
"#EC NOTEXT

* ` try {`,
"#EC NOTEXT
* ` testcase[name] = value
;`,
"#EC NOTEXT

* ` document.getElementByI
d("fld." + name).innerText = value;`,
"#EC NOTEXT

* ` } catch(e) {}`,
"#EC NOTEXT

* ` return value;`,
"#EC NOTEXT

* ` }`,
"#EC NOTEXT

* `JSF function testcase.{name} {


`,
"#EC NOTEXT

* `JSF {value};`,
"#EC NOTEXT

* `JSF }`,
"#EC NOTEXT

* `BTN function testcase.fire{nam


e}() {`,
"#EC NOTEXT

* `BTN {value};`,
"#EC NOTEXT

* `BTN return false;`,


"#EC NOTEXT

* `BTN }`,
"#EC NOTEXT

* ` </script>`,
"#EC NOTEXT

* ` <form method="post">`,
"#EC NOTEXT

* ` <!-- title -->`,


"#EC NOTEXT

* ` <h1>{testcase-id}:{testcas
e-title}</h1>`,
"#EC NOTEXT

* ` <!-- overview -->`,


"#EC NOTEXT
* ` <p>`,
"#EC NOTEXT

* `OVER {text}`,
"#EC NOTEXT

* ` </p>`,
"#EC NOTEXT

* ` <!-- steps -->`,


"#EC NOTEXT

* ` <hr>`,
"#EC NOTEXT

* ` <ol>`,
"#EC NOTEXT

* `STEP <li>{step}`,
"#EC NOTEXT

* ` </ol>`,
"#EC NOTEXT

* ` <!-- fields -->`,


"#EC NOTEXT
* ` <hr>`,
"#EC NOTEXT

* ` <table>`,
"#EC NOTEXT

* `FLD <tr><td>{name}</td><td><
span id="fld.{name}">{value}</span></td></
tr>`, "#EC NOTEXT

* ` </table>`,
"#EC NOTEXT

* ` <!-- buttons -->`,


"#EC NOTEXT

* ` <hr>`,
"#EC NOTEXT

* ` <span id="buttons">`,
"#EC NOTEXT

* `BTN <input type="submit" val


ue="{name}" onclick="return testcase.fire{
name}();">`, "#EC NOTEXT
* ` </span>`,
"#EC NOTEXT

* ` <!-- HTML sequences -->`,


"#EC NOTEXT

* ` <hr>`,
"#EC NOTEXT

* `HTML {html}`,
"#EC NOTEXT

* ` </form>`,
"#EC NOTEXT

* ` <script>`,
"#EC NOTEXT

* `JS {value};`,
"#EC NOTEXT

* ` </script>`,
"#EC NOTEXT

* ` </body>`,
"#EC NOTEXT
* ` </html>`.
"#EC NOTEXT

* DATA: nwbc_context TYPE cl_nwbc=>t_co


ntext.

* nwbc_context = cl_nwbc=>context_get(
http_request = me->request ).

* IF nwbc_context-valid = abap_true.

* DATA: role_entry TYPE string.

* CONCATENATE nwbc_context-role_name
':' nwbc_context-role_id INTO role_entry.

* me->field( name = 'role_entry' valu


e = role_entry ).

*
* DATA: navigation_tree TYPE if_nwbc_
runtime=>t_navigation_tree.

* FIELD-SYMBOLS: <entry> LIKE LINE OF


navigation_tree.

* navigation_tree = nwbc_runtime->get
_navigation_tree( ).

* READ TABLE navigation_tree ASSIGNIN


G <entry> WITH KEY agr_name = nwbc_context
-role_name origin_id = nwbc_context-role_i
d.

* IF sy-subrc IS INITIAL.

* me->field( name = 'unique_id' va


lue = <entry>-unique_id ).

* me->field( name = 'text' va


lue = <entry>-text ).

* me->field( name = 'menu_level' va


lue = <entry>-menu_level ).
* ENDIF.

* ENDIF.

* DATA: roundtrips TYPE string.

* roundtrips = me->ff( 'roundtrips' ).

* roundtrips = roundtrips + 1.

* me->field( name = 'roundtrips' value


= roundtrips ).

* me->button( name = 'Roundtrip' value


= 'testcase.triggerRoundTrip();' ). "#EC N
OTEXT

* ENDMETHOD.
*

* METHOD id.

* me->token_all( token = '{testcase-id}


' value = text ).

* me->field( name = 'id' value = text )


.

* ENDMETHOD.

*
* METHOD title.

* me->token_all( token = '{testcase-tit


le}' value = text ).

* ENDMETHOD.

* METHOD overview.

* CONCATENATE text ` ` INTO text.

* me->token_one( line = 'OVER' token =


'{text}' value = text ).

* ENDMETHOD.
*

* METHOD do.

* CONCATENATE `DO ` text INTO text.

* me->token_one( line = 'STEP' token =


'{step}' value = text ).

* ENDMETHOD.

* METHOD observe.

* CONCATENATE `OBSERVE ` text INTO text


.
* me->token_one( line = 'STEP' token =
'{step}' value = text ).

* ENDMETHOD.

* METHOD repeat.

* CONCATENATE `REPEAT ` text INTO text.

* me->token_one( line = 'STEP' token =


'{step}' value = text ).

* ENDMETHOD.

* METHOD field.
* DATA nvp TYPE ihttpnvp.

* nvp-name = name.

* IF value IS SUPPLIED.

* nvp-value = value.

* ELSE.

* nvp-value = me->ff( nvp-name ).

* ENDIF.

* me->token_nvp( line = 'FLD' nvp = nvp


).

* ENDMETHOD.
*

* METHOD button.

* DATA nvp TYPE ihttpnvp.

* nvp-name = name.

* nvp-value = value.

* me->token_nvp( line = 'BTN' nvp = nv


p ).

* ENDMETHOD.

*
* METHOD javascript.

* DATA nvp TYPE ihttpnvp.

* nvp-name = function.

* nvp-value = code.

* REPLACE ALL OCCURRENCES OF '{crlf}' I


N nvp-value WITH crlf.

* IF nvp-name IS NOT INITIAL AND nvp-na


me NA '()'.

* CONCATENATE nvp-name '()' INTO nvp-


name.

* ENDIF.

* IF nvp-name IS NOT INITIAL.


* me->token_nvp( line = 'JSF' nvp =
nvp ).

* ELSE.

* me->token_nvp( line = 'JS' nvp =


nvp ).

* ENDIF.

* ENDMETHOD.

* METHOD raw_html.

* REPLACE ALL OCCURRENCES OF '{crlf}' I


N code WITH crlf.
* me->token_one( line = 'HTML' token =
'{html}' value = code ).

* ENDMETHOD.

*ENDCLASS.

**----------------------------------------
------------------------------*

** CLASS lcl_testcase_url_hash
**----------------------------------------
------------------------------*

*CLASS lcl_testcases DEFINITION.

* PUBLIC SECTION.

* CLASS-METHODS:

* execute IMPORTING testcase


TYPE string server TYPE REF TO if_http_se
rver nwbc_runtime TYPE REF TO if_nwbc_runt
ime.

* PRIVATE SECTION.

* CLASS-METHODS:

* home_page IMPO
RTING tc TYPE REF TO lcl_testcase,
* single_top_level IMPO
RTING tc TYPE REF TO lcl_testcase,

* deep_tree IMPO
RTING tc TYPE REF TO lcl_testcase,

* wide_tree IMPO
RTING tc TYPE REF TO lcl_testcase,

* url_hash IMPO
RTING tc TYPE REF TO lcl_testcase,

* navigation_tree IMPO
RTING tc TYPE REF TO lcl_testcase,

* navigation_tree_properties IMPO
RTING tc TYPE REF TO lcl_testcase,

* navigation_tree_i18n IMPO
RTING tc TYPE REF TO lcl_testcase,

* navigation_tree_apps IMPO
RTING tc TYPE REF TO lcl_testcase,

* navigation_tree_external_apps IMPO
RTING tc TYPE REF TO lcl_testcase,
* navigation_tree_fld_home_page IMPO
RTING tc TYPE REF TO lcl_testcase,

* navigation_tree_fld_servicemap IMPO
RTING tc TYPE REF TO lcl_testcase,

* navigation_tree_compression IMPO
RTING tc TYPE REF TO lcl_testcase,

* navigation_tree_remote IMPO
RTING tc TYPE REF TO lcl_testcase,

* menu_new IMPO
RTING tc TYPE REF TO lcl_testcase,

* menu_search IMPO
RTING tc TYPE REF TO lcl_testcase,

* menu_help IMPO
RTING tc TYPE REF TO lcl_testcase,

* menu_personalize IMPO
RTING tc TYPE REF TO lcl_testcase,

* link_collections IMPO
RTING tc TYPE REF TO lcl_testcase,

* link_collections_normal IMPO
RTING tc TYPE REF TO lcl_testcase,

* link_collections_add IMPO
RTING tc TYPE REF TO lcl_testcase,

* link_collections_deep IMPO
RTING tc TYPE REF TO lcl_testcase,

* link_collections_multi IMPO
RTING tc TYPE REF TO lcl_testcase,

* api IMPO
RTING tc TYPE REF TO lcl_testcase,

* api_test_canvas IMPO
RTING tc TYPE REF TO lcl_testcase,

* api_non_sap_portal IMPO
RTING tc TYPE REF TO lcl_testcase,

* api_atom IMPO
RTING tc TYPE REF TO lcl_testcase,
* api_slow_load IMPO
RTING tc TYPE REF TO lcl_testcase.

*ENDCLASS.

*CLASS lcl_testcases IMPLEMENTATION.

* METHOD execute.

* DATA: tc TYPE REF TO lcl_testcase.

* CREATE OBJECT tc EXPORTING server = s


erver nwbc_runtime = nwbc_runtime.
* CASE testcase.

* WHEN 'HOME_PAGE'.
home_page( tc ).

* WHEN 'SINGLE_TOP_LEVEL'.
single_top_level( tc ).

* WHEN 'DEEP_TREE'.
deep_tree( tc ).

* WHEN 'WIDE_TREE'.
wide_tree( tc ).

* WHEN 'URL_HASH'.
url_hash( tc ).

* WHEN 'NAVIGATION_TREE'.
navigation_tree( tc ).

* WHEN 'NAVIGATION_TREE.PROPERTIES'.
navigation_tree_properties( tc )
.
* WHEN 'NAVIGATION_TREE.I18N'.
navigation_tree_i18n( tc ).

* WHEN 'NAVIGATION_TREE.APPS'.
navigation_tree_apps( tc ).

* WHEN 'NAVIGATION_TREE.EXTERNAL_APPS
'. navigation_tree_external_apps( t
c ).

* WHEN 'NAVIGATION_TREE.FOLDER_HOME_P
AGE'. navigation_tree_fld_home_page( t
c ).

* WHEN 'NAVIGATION_TREE.FOLDER_SERVIC
E_MAP'. navigation_tree_fld_servicemap(
tc ).

* WHEN 'NAVIGATION_TREE.COMPRESSION'.
navigation_tree_compression( tc
).

* WHEN 'NAVIGATION_TREE.REMOTE'.
navigation_tree_remote( tc ).

* WHEN 'MENU.NEW'.
menu_new( tc ).

* WHEN 'MENU.SEARCH'.
menu_search( tc ).
* WHEN 'MENU.HELP'.
menu_help( tc ).

* WHEN 'MENU.PERSONALIZE'.
menu_personalize( tc ).

* WHEN 'LINK_COLLECTIONS'.
link_collections( tc ).

* WHEN 'LINK_COLLECTIONS.NORMAL'.
link_collections_normal( tc ).

* WHEN 'LINK_COLLECTIONS.ADD'.
link_collections_add( tc ).

* WHEN 'LINK_COLLECTIONS.DEEP'.
link_collections_deep( tc ).

* WHEN 'LINK_COLLECTIONS.MULTI'.
link_collections_multi( tc ).

* WHEN 'API'.
api( tc ).
* WHEN 'API.TEST_CANVAS'.
api_test_canvas( tc ).

* WHEN 'API.NON_SAP_PORTAL'.
api_non_sap_portal( tc ).

* WHEN 'API.ATOM'.
api_atom( tc ).

* WHEN 'API.SLOW_LOAD'.
api_slow_load( tc ).

* WHEN OTHERS.
cx_nwbc=>invalid_command( cmd =
testcase ).

* ENDCASE.

* tc->render( ).

* ENDMETHOD.

*
*

* METHOD home_page.

* tc->id( 'HOME_PAGE' ).

* tc->title( 'Test a Work Center with o


nly a Home Page' ). "#EC NOTEXT

* tc->overview( `This test case is a wo


rk center with only a home page, no other
navigation elements.` ). "#EC NOTEXT

* tc->observe( `that there are no top o


r left navigation elements.` ). "#EC NOTEX
T

* ENDMETHOD.

*
* METHOD single_top_level.

* tc->id( 'SINGLE_TOP_LEVEL'). "#EC NOT


EXT

* tc->title( 'Test 2nd Level Navigation


Already on Left Panel' ). "#EC NOTEXT

* tc->overview( `By default, the first


two level of navigation is shown at the to
p level,` ). "#EC NOTEXT

* tc->overview( `starting only with lev


el three to show the navigation on the lef
t panel.` ). "#EC NOTEXT

* tc->overview( `However, for some type


s of work center, it would be more benefic
ial to have already` ). "#EC NOTEXT
* tc->overview( `the second level navig
ation on the left panel, effectively havin
g only the` ). "#EC NOTEXT

* tc->overview( `work center itself as


top level navigation element.` ). "#EC NOT
EXT

* tc->do( `click on any shell entr


y on the left panel.` ). "#EC NOTEXT

* tc->observe( `that the second level n


avigation is placed on the left panel.` ).
"#EC NOTEXT

* tc->repeat( `a number of times.` ).


"#EC NOTEXT

* ENDMETHOD.

*
*

* METHOD deep_tree.

* tc->id( 'DEEP_TREE' ). "#EC NOTEXT

* tc->title( 'Test 10+ Level Deep Navig


ation Tree' ). "#EC NOTEXT

* tc->overview( `This test case is to l


ook at the handling of a very deep navigat
ion tree, at least three levels.` ). "#EC
NOTEXT

*
* tc->do( `click on a child folder
to navigate deeper into the navigation tr
ee.` ). "#EC NOTEXT

* tc->observe( `that the navigation tre


e is rendered correctly.` ). "#EC NOTEXT

* tc->repeat( `until the last leaf nod


e in the navigation tree is reached.` ). "
#EC NOTEXT

* ENDMETHOD.

* METHOD wide_tree.

*
* tc->id( 'WIDE_TREE' ). "#EC NOTEXT

* tc->title( 'Test 10+ Level Broad Navi


gation Tree (at Level 2 & 3)' ). "#EC NOTE
XT

* tc->overview( `Look at the handling o


f broad trees, especially at level 2 (whic
h is still in the top level navigation are
a)` ). "#EC NOTEXT

* tc->overview( `and level 3 (already o


n the left panel).` ). "#EC NOTEXT

* tc->do( `click on any shell entr


y on level 2 or level 3.` ). "#EC NOTEXT

* tc->observe( `that the navigation tre


e is rendered correctly.` ). "#EC NOTEXT
* tc->repeat( `until the width of the
tree is reached at both level 2 and level
3.` ). "#EC NOTEXT

* ENDMETHOD.

* METHOD url_hash.

* tc->id( 'URL_HASH' ).

"#EC NOTEXT

* tc->title( 'Test Stable Canvases Usin


g Hashed URLs (/url#hash)' ).
"#EC NOTEXT
*

* tc->overview( `Normally in a browser,


if URLs are loaded in sequence that are a
ll exactly the same, with a` ).
"#EC NOTEXT

* tc->overview( `difference only in a t


railing hash sequence (for example '/url#A
' and '/url#B'), then the browser` ).
"#EC NOTEXT

* tc->overview( `will not load the page


new, but only the hash on the URL is upda
ted. The browser page itself` ).
"#EC NOTEXT

* tc->overview( `is kept stable. NWBC u


ses same approach to keep a canvas stable
through a set of shell navigation ` ).
"#EC NOTEXT

* tc->overview( `steps. As long as the


following URLs are "stable", the shell nav
igation will not load the URLs` ).
"#EC NOTEXT

* tc->overview( `new, but just update t


he shell and set the new hash value in th
e canvas container the browser.` ).
"#EC NOTEXT

* tc->do( `click on any shell entr


y that is part of this test case (all have
same base name followed with a '#' sequen
ce).` ). "#EC NOTEXT

* tc->observe( `that the page counter s


tays stable.` ).
"#EC NOTEXT

* tc->observe( `that page hash value re


flects the value from navigation tree.` ).
"#EC NOTEXT

* tc->do( `press button to increas


e local counter.` ).
"#EC NOTEXT

* tc->do( `press button trigger ro


undtrip.` ).
"#EC NOTEXT

* tc->observe( `that the page counter s


tays stable.` ).
"#EC NOTEXT

* tc->observe( `that page hash value is


empty.` ).
"#EC NOTEXT

* tc->repeat( `all above steps.` ).

"#EC NOTEXT

*
* tc->field( name = 'counter' ).

"#EC NOTEXT

* tc->field( name = 'hash' ).

"#EC NOTEXT

* tc->button( name = 'Counter' value


= 'var c = testcase.get("counter"); testca
se.set("counter", ++c);' ).
"#EC NOTEXT

* tc->button( name = 'GetHash' value


= 'testcase.set("hash", document.location.
hash);' ).
"#EC NOTEXT

* tc->javascript( function = 'UpdateHas


h()' code = 'testcase.fireGetHash(); windo
w.setTimeout("testcase.UpdateHash();", 100
0);' ). "#EC NOTEXT

* tc->javascript(
code = 'testcase.UpdateHash();' ).
"#EC NOTEXT

*
* ENDMETHOD.

* METHOD navigation_tree.

* tc->id( 'NAVIGATION_TREE' ).
"#EC NOTEXT

* tc->title( 'Set of Test Cases Around


Navigation Tree' ).
"#EC NOTEXT

* tc->overview( `Within the PFCG it is


possible to configure different types of s
cenarios` ). "#EC NOTEXT

* tc->overview( `for visualization with


NWBC. This folder contains test cases for
most` ). "#EC NOTEXT
* tc->overview( `of the possible scenar
ios.` ).
"#EC NOTEXT

* tc->do( `run the test cases at level


2 one by one.` ).
"#EC NOTEXT

* ENDMETHOD.

* METHOD navigation_tree_properties.

* tc->id( 'NAVIGATION_TREE.PROPERTIES'
).
"#EC NOTEXT

* tc->title( 'Test Different Node Prope


rties in Navigation Tree' ).
"#EC NOTEXT

* tc->overview( `There are a number of


settings that are possible for each node`
). "#EC NOTEXT
* tc->overview( `entry. Test these thro
ugh.` ).
"#EC NOTEXT

* tc->observe( `that the first entry is


visualized as "normal".` ).
"#EC NOTEXT

* tc->observe( `that the second entry i


s visualized as "emphasized".` ).
"#EC NOTEXT

* tc->observe( `that the third entry is


visualized as "disabled".` ).
"#EC NOTEXT

* tc->observe( `that the fourth entry h


as a tooltip.` ).
"#EC NOTEXT

* tc->observe( `that there is NO "hidde


n" entry.` ).
"#EC NOTEXT

* tc->do( `attempt to select the d


isabled entry.` ).
"#EC NOTEXT

* tc->observe( `that it is not possible


to select the disabled entry.` ).
"#EC NOTEXT
* ENDMETHOD.

* METHOD navigation_tree_i18n.

* tc->id( 'NAVIGATION_TREE.I18N' ).
"#EC NOTEXT

* tc->title( 'Test Different Names with


International Characters' ).
"#EC NOTEXT

* tc->overview( `Test different types o


f characters with the names, especially te
st` ). "#EC NOTEXT

* tc->overview( `internationalization c
haracters and special characters that caus
e` ). "#EC NOTEXT

* tc->overview( `problems especially in


HTML shells.` ).
"#EC NOTEXT
* tc->observe( `Oyz` ).
"#EC *

* tc->observe( `@5A@ SAP Icon` ).


"#EC NOTEXT

* tc->observe( `'Single Quoted Text'` )


.
"#EC NOTEXT

* tc->observe( `"Double Quoted Text"` )


.
"#EC NOTEXT

* tc->observe( `&lt;i&gt;HTML Sequence


Italics&lt;/i&gt;` ).
"#EC NOTEXT

* tc->observe( `Percentage Character (%


20)` ).
"#EC NOTEXT

* ENDMETHOD.

*
* METHOD navigation_tree_apps.

* tc->id( 'NAVIGATION_TREE.APPS' ).
"#E
C NOTEXT

* tc->title( 'Test Different Applicatio


ns within the Shell' ).
"#E
C NOTEXT

* tc->overview( `Test different types o


f applications within the shell. Especiall
y of interest in this test is` ). "#E
C NOTEXT

* tc->overview( `to see that these appl


ications can be started and that it is pos
sible to navigate between them.` ). "#E
C NOTEXT

* tc->do( 'systematically click th


rough all applications in the sub tree and
start each application.' ). "#E
C NOTEXT
* tc->observe( 'that each application i
s started correctly.' ).
"#E
C NOTEXT

* tc->do( 'click again on the "App


lication" node at level 2 for this test ca
se.' ). "#E
C NOTEXT

* tc->observe( 'that there are no addit


ional started sessions dangling.' ).
"#E
C NOTEXT

* tc->do( 'click to start again an


y of the URL based applications.' ).
"#E
C NOTEXT

* tc->do( 'use shift-click on any


link in the URL based application to start
link in a new window.' ). "#E
C NOTEXT

* tc->observe( 'that the page is starte


d in a new NWBC window.' ).
"#E
C NOTEXT

* tc->repeat( 'systematically SHIFT-c


lick through all applications in the sub t
ree and start each application.' ). "#E
C NOTEXT

* tc->observe( 'that each application i


s started correctly in a NEW window.' ).
"#E
C NOTEXT

*
* DATA: session_html TYPE string.

* DATA: sessions TYPE STANDARD TABLE OF


uinfo WITH DEFAULT KEY,

* session LIKE LINE OF sessions.

* CALL FUNCTION 'TH_USER_LIST' TABLES l


ist = sessions.

* LOOP AT sessions INTO session WHERE b


name = sy-uname AND mandt = sy-mandt.

* CONCATENATE session_html

* `<tr><td>&nbsp;` sessio
n-term `</td><td>&nbsp;` session-zeit `</t
d><td>&nbsp;` session-tcode `</td></tr>`

* INTO session_html.
* ENDLOOP.

* CONCATENATE `<table border="1">` sess


ion_html `</table>` INTO session_html.

* tc->raw_html( session_html ).

* ENDMETHOD.

* METHOD navigation_tree_external_apps.

* tc->id( 'NAVIGATION_TREE.EXTERNAL_APP
S' ).
"
#EC NOTEXT

* tc->title( 'Test Different External A


pplications within the Shell' ).
"
#EC NOTEXT

* tc->overview( `Test different types o


f external (local) applications within the
shell. This is especially complex` ). "
#EC NOTEXT

* tc->overview( `as it is not possible


to always start these applications within
NWBC for HTML.` ). "
#EC NOTEXT

* tc->do( `***NOT READY YET***` ).


"
#EC NOTEXT

* ENDMETHOD.

* METHOD navigation_tree_fld_home_page.

* tc->id( 'NAVIGATION_TREE.FOLDER_HOME_
PAGE' ).
"
#EC NOTEXT

* tc->title( 'Test Folder with only Hom


e Page' ).
"
#EC NOTEXT
* tc->overview( `It is possible that a
folder can have only a home page, then it
acts effectively as link entry.` ). "
#EC NOTEXT

* tc->overview( `In addition, this test


case also covers empty folders. Empty fo
lders are filtered and not shown in` ). "
#EC NOTEXT

* tc->overview( `the navigation tree. B


efore this folder is an "Empty Folder" tha
t should not be visible.` ). "
#EC NOTEXT

* tc->observe( `that before this entry


there is NO "Empty Folder".` ).
"
#EC NOTEXT

* tc->observe( `that there are no furth


er navigation elements for this folder.` )
. "
#EC NOTEXT

* ENDMETHOD.

* METHOD navigation_tree_fld_servicemap.
* tc->id( 'NAVIGATION_TREE.FOLDER_SERVI
CE_MAP' ).
"
#EC NOTEXT

* tc->title( 'Test Folder with a Servic


e Map' ).
"
#EC NOTEXT

* tc->overview( `Test a folder with a s


ervice map configured. If a folder has als
o a home page (or here a test case),` ). "
#EC NOTEXT

* tc->overview( `the home page has prio


rity. As such, have separate folder with s
ervice map defined.` ). "
#EC NOTEXT

* tc->overview( `To test is one that th


e service map shows the sub navigation tre
e and two that the service map` ). "
#EC NOTEXT

* tc->overview( `can also be used to tr


igger navigation.` ).
"
#EC NOTEXT

* tc->do( `select the service map folde


r.` ).
"
#EC NOTEXT

* tc->observe( `that the service map re


flects the sub tree.` ).
"
#EC NOTEXT

* tc->do( `select an entry from the ser


vice map.` ).
"
#EC NOTEXT

* tc->observe( `that shell navigates to


the entry.` ).
"
#EC NOTEXT

* tc->observe( `that the selected entry


on the shell is updated to reflect the se
lected service map entry.` ). "
#EC NOTEXT

* ENDMETHOD.

* METHOD navigation_tree_compression.

* tc->id( 'NAVIGATION_TREE.COMPRESSION'
).
"
#EC NOTEXT

* tc->title( 'Test Navigation Tree Comp


ression' ).
"
#EC NOTEXT

* tc->overview( `Within the navigation


tree, compression of the navigation tree i
s done on` ). "
#EC NOTEXT
* tc->overview( `comparison of folder n
ames. As long as folder names are the same
, their content` ). "
#EC NOTEXT

* tc->overview( `will be merged into si


ngle folders. Duplicate entries are remove
d (actually hidden).` ). "
#EC NOTEXT

* tc->do( `expand complete sub tree.` )


.
"
#EC NOTEXT

* tc->observe( `that there is exactly o


ne of each named entry visible.` ).
"
#EC NOTEXT

* ENDMETHOD.

* METHOD navigation_tree_remote.

* tc->id( 'NAVIGATION_TREE.REMOTE' ).
"
#EC NOTEXT

* tc->title( 'Test Navigation Tree Remo


te' ).
"
#EC NOTEXT

* tc->overview( `Within the navigation


tree, it is possible to define that specif
ic applications` ). "
#EC NOTEXT

* tc->overview( `should be started on a


remote system. This is done by configurin
g the target` ). "
#EC NOTEXT

* tc->overview( `system for the specifi


c entry. For this test case, the transacti
on SM51 is` ). "
#EC NOTEXT

* tc->overview( `started on a number of


systems. ***CAUTION***: This test case ca
n only work` ). "
#EC NOTEXT

* tc->overview( `if the SM59 targets SA


P_NWBC_TEST_ROLE_X to ... _Z has been defi
ned.` ). "
#EC NOTEXT

* tc->do( `select the SM51 local entry.


` ).
"
#EC NOTEXT

* tc->observe( `that transaction SM51 i


s started locally.` ).
"
#EC NOTEXT
* tc->do( `select the SM51 on X entry.`
).
"
#EC NOTEXT

* tc->observe( `that transaction SM51 i


s started on a different box.` ).
"
#EC NOTEXT

* tc->repeat( `for Y & Z entries.` ).


"
#EC NOTEXT

* tc->do( `select the SM51 on UNDEFINED


entry.` ).
"
#EC NOTEXT

* tc->observe( `that an error message i


s displayed that the target is unknown.` )
. "
#EC NOTEXT

* ENDMETHOD.

* METHOD menu_new.
* tc->id( 'MENU.NEW' ).
"#
EC NOTEXT

* tc->title( 'Test Case to Add a Comple


te New Menu Tree' ).
"#
EC NOTEXT

* tc->overview( `It is possible to defi


ne a complete new menu entry for NWBC, sta
rting at the` ). "#
EC NOTEXT

* tc->overview( `root level. This test


case defines such a menu tree.` ).
"#
EC NOTEXT

* tc->do( `open the "Test Case" menu an


d select any of the test case entries.` ).
"#
EC NOTEXT

* tc->observe( `that the test case entr


y is loaded in the shell canvas.` ).
"#
EC NOTEXT

* tc->do( `open the "Test Case" menu an


d specifically select an entry from the su
b folder.` ). "#
EC NOTEXT

* tc->observe( `that the test case entr


y is loaded in the shell canvas.` ).
"#
EC NOTEXT
* tc->do( `open the "Test Case" menu an
d select any of the test case entries with
SHIFT-CLICK.` ). "#
EC NOTEXT

* tc->observe( `that the test case entr


y is loaded in a new window.` ).
"#
EC NOTEXT

* ENDMETHOD.

* METHOD menu_search.
"#
EC NOTEXT

* tc->id( 'MENU.SEARCH' ).
"#
EC NOTEXT

* tc->title( 'Test Case to Extend Searc


h Menu' ).
"#
EC NOTEXT

* tc->overview( `This test case is abou


t adding own search providers, effectively
extending the` ). "#
EC NOTEXT
* tc->overview( `list of search provide
rs. Of interest is how the query is passed
with a token` ). "#
EC NOTEXT

* tc->overview( `replacement on {0}.` )


.
"#
EC NOTEXT

* tc->do( `entry any search query strin


g.` ).
"#
EC NOTEXT

* tc->do( `select one of the "Test Case


" search engines.` ).
"#
EC NOTEXT

* tc->do( `press "Search" button.` ).


"#
EC NOTEXT

* tc->observe( `that a new window is o


pened with the test case entry.` ).
"#
EC NOTEXT

* tc->observe( `that a search query is


correctly reflected in this new window.` )
. "#
EC NOTEXT

* tc->field( 'query' ).
"#
EC NOTEXT

* ENDMETHOD.
"#
EC NOTEXT

*
"#
EC NOTEXT

*
"#
EC NOTEXT

* METHOD menu_help.
"#
EC NOTEXT

* tc->id( 'MENU.HELP' ).
"#
EC NOTEXT

* tc->title( 'Test Case to Extend Help


Menu' ).
"#
EC NOTEXT

* tc->overview( `This test case is abou


t extending the help menu. Typical use cou
ld be to provide` ). "#
EC NOTEXT

* tc->overview( `local help information


, for example a link to a wiki page with
hotline numbers.` ). "#
EC NOTEXT

* tc->do( `open the "Help" menu and sel


ect any of the test case entries.` ).
"#
EC NOTEXT
* tc->observe( `that the test case entr
y is loaded in the shell canvas.` ).
"#
EC NOTEXT

* tc->do( `open the "Help" menu and spe


cifically select an entry from the sub fol
der.` ). "#
EC NOTEXT

* tc->observe( `that the test case entr


y is loaded in the shell canvas.` ).
"#
EC NOTEXT

* tc->do( `open the "Help" menu and sel


ect any of the test case entries with SHIF
T-CLICK.` ). "#
EC NOTEXT

* tc->observe( `that the test case entr


y is loaded in a new window.` ).
"#
EC NOTEXT

* ENDMETHOD.
"#
EC NOTEXT

*
"#
EC NOTEXT

*
"#
EC NOTEXT

* METHOD menu_personalize.
"#
EC NOTEXT

* tc->id( 'MENU.PERSONALIZE' ).
"#
EC NOTEXT

* tc->title( 'Test Case to Extend Perso


nalize Menu' ).
"#
EC NOTEXT

* tc->overview( `Test case to extend pe


rsonalize menu.` ).
"#
EC NOTEXT

* tc->do( `open the "Personalize" menu


and select any of the test case entries.`
). "#
EC NOTEXT

* tc->observe( `that the test case entr


y is loaded in the shell canvas.` ).
"#
EC NOTEXT

* tc->do( `open the "Personalize" menu


and specifically select an entry from the
sub folder.` ). "#
EC NOTEXT

* tc->observe( `that the test case entr


y is loaded in the shell canvas.` ).
"#
EC NOTEXT

* tc->do( `open the "Personalize" menu


and select any of the test case entries wi
th SHIFT-CLICK.` ). "#
EC NOTEXT
* tc->observe( `that the test case entr
y is loaded in a new window.` ).
"#
EC NOTEXT

* ENDMETHOD.
"#
EC NOTEXT

*
"#
EC NOTEXT

*
"#
EC NOTEXT

* METHOD link_collections.
"#
EC NOTEXT

* tc->id( 'LINK_COLLECTIONS' ).
"#
EC NOTEXT

* tc->title( 'Test Case for a Number of


Link Collection Possibilities' ).
"#
EC NOTEXT

* tc->overview( `Link Collections are s


pecial type of navigation nodes that are a
lways` ). "#
EC NOTEXT

* tc->overview( `shown after the normal


navigation nodes and has the purpose to p
rovide` ). "#
EC NOTEXT

* tc->overview( `additional information


. Typical examples could be link collectio
ns for` ). "#
EC NOTEXT

* tc->overview( `"You can also..." or "


Additional Transactions" or "Knowledge Bas
e".` ). "#
EC NOTEXT

* tc->overview( `Given the nature of li


nk collections to be that of providing add
itional` ). "#
EC NOTEXT

* tc->overview( `context related infora


mtion, they are so designed that link coll
ections` ). "#
EC NOTEXT

* tc->overview( `will always open in a


new window.` ).
"#
EC NOTEXT

* tc->do( `click any link collection en


try on the left panel.` ).
"#
EC NOTEXT

* tc->observe( `that the entry is start


ed in a NEW window.` ).
"#
EC NOTEXT

* tc->repeat( `run the test cases at le


vel 2 one by one.` ).
"#
EC NOTEXT
* ENDMETHOD.
"#
EC NOTEXT

*
"#
EC NOTEXT

*
"#
EC NOTEXT

* METHOD link_collections_normal.
"#
EC NOTEXT

* tc->id( 'LINK_COLLECTIONS.NORMAL' ).
"#
EC NOTEXT

* tc->title( 'Test Case for a Normal Fo


lder with Inherited Link Collection' ).
"#
EC NOTEXT

* tc->overview( `Link collections are i


nherited from parent to child folders.` ).
"#
EC NOTEXT

* tc->overview( `At this folder we have


NO link collection defined. This folder o
nly` ). "#
EC NOTEXT

* tc->overview( `inherits the link coll


ection from the parent folder.` ).
"#
EC NOTEXT
* tc->do( `click on normal entry on the
left panel.` ).
"#
EC NOTEXT

* tc->observe( `that the entry is start


ed in the shell canvas.` ).
"#
EC NOTEXT

* tc->do( `click any link collection en


try on the left panel.` ).
"#
EC NOTEXT

* tc->observe( `that the entry is start


ed in a NEW window.` ).
"#
EC NOTEXT

* tc->observe( `that the entry starts t


he inherited application (test case "LINK_
COLLECTIONS").` ). "#
EC NOTEXT

* ENDMETHOD.
"#
EC NOTEXT

*
"#
EC NOTEXT

*
"#
EC NOTEXT

* METHOD link_collections_add.
"#
EC NOTEXT

* tc->id( 'LINK_COLLECTIONS.ADD' ).
"#
EC NOTEXT

* tc->title( 'Test Case Showing Adding/


Extending Link Collections' ).
"#
EC NOTEXT

* tc->overview( `At any folder level it


is possible to extend a link collection b
y` ). "#
EC NOTEXT

* tc->overview( `adding more entries in


to an existing link collection inherited f
rom` ). "#
EC NOTEXT

* tc->overview( `the parent folder or b


y defining a new link collection.` ).
"#
EC NOTEXT

* tc->observe( `that the link collectio


n inherited from parent node has been exte
nded with addition nodes.` ). "#
EC NOTEXT

* tc->observe( `that a new/additional l


ink collection has been added.` ).
"#
EC NOTEXT

* tc->do( `click any "inherited" link c


ollection entry on the left panel.` ).
"#
EC NOTEXT
* tc->observe( `that the entry is start
ed in a NEW window.` ).
"#
EC NOTEXT

* tc->observe( `that the entry starts t


he inherited application (test case "LINK_
COLLECTIONS").` ). "#
EC NOTEXT

* tc->do( `click any "added" link colle


ction entry on the left panel.` ).
"#
EC NOTEXT

* tc->observe( `that the entry is start


ed in a NEW window.` ).
"#
EC NOTEXT

* tc->observe( `that the entry starts t


he added application (test case "LINK_COLL
ECTIONS.ADD").` ). "#
EC NOTEXT

* ENDMETHOD.
"#
EC NOTEXT

*
"#
EC NOTEXT

*
"#
EC NOTEXT

* METHOD link_collections_deep.
"#
EC NOTEXT

* tc->id( 'LINK_COLLECTIONS.DEEP' ).
"#
EC NOTEXT

* tc->title( 'Test Case for Deeply Stru


ctured Link Collections' ).
"#
EC NOTEXT

* tc->overview( `It is possible that li


nk collections can have sub folders.` ).
"#
EC NOTEXT

* tc->do( `select any of the link colle


ction entries from the deeply structured c
ollection.` ). "#
EC NOTEXT

* tc->observe( `that the navigation tre


e rendering is correct.` ).
"#
EC NOTEXT

* tc->observe( `that the entry is start


ed in a NEW window.` ).
"#
EC NOTEXT

* tc->repeat( `a number of times to dep


th of Folder 3.3.3` ).
"#
EC NOTEXT

* ENDMETHOD.
"#
EC NOTEXT
*
"#
EC NOTEXT

*
"#
EC NOTEXT

* METHOD link_collections_multi.
"#
EC NOTEXT

* tc->id( 'LINK_COLLECTIONS.MULTI' ).
"#
EC NOTEXT

* tc->title( 'Test Case for Multiple Li


nk Collections' ).
"#
EC NOTEXT

* tc->overview( `It is also possible to


define multiple link collections in one f
older.` ). "#
EC NOTEXT

* tc->overview( `The link collections w


ill be rendered below one another.` ).
"#
EC NOTEXT

* tc->do( `click any link collection en


try on the left panel.` ).
"#
EC NOTEXT

* tc->observe( `that the entry is start


ed in a NEW window.` ).
"#
EC NOTEXT

* tc->repeat( `test for second link col


lection.` ).
"#
EC NOTEXT

* ENDMETHOD.
"#
EC NOTEXT

*
"#
EC NOTEXT

*
"#
EC NOTEXT

* METHOD api.
"#
EC NOTEXT

* tc->id( 'API' ).
"#
EC NOTEXT

* tc->title( 'Test Case for Differ APIs


' ).
"#
EC NOTEXT

* tc->overview( `This node just contain


s a set of test cases for different APIs a
nd other` ). "#
EC NOTEXT
* tc->overview( `miscellaneous aspects.
` ).
"#
EC NOTEXT

* tc->do( `run the test cases at level


2 one by one.` ).
"#
EC NOTEXT

* ENDMETHOD.
"#
EC NOTEXT

*
"#
EC NOTEXT

*
"#
EC NOTEXT

* METHOD api_test_canvas.
"#
EC NOTEXT

*
"#
EC NOTEXT

* tc->id( 'API.TEST_CANVAS' ).
"#
EC NOTEXT

* tc->title( 'Test Case for Constructin


g Server Based Tests' ).
"#
EC NOTEXT
* tc->overview( `For example, during au
thentication tests it is important to veri
fy that` ). "#
EC NOTEXT

* tc->overview( `the user is actually l


ogged on in the correct client and languag
e.` ). "#
EC NOTEXT

* tc->overview( `This test canvas echo'


s as much data as possible to construct su
ch test cases.` ). "#
EC NOTEXT

* tc->observe( `that the logged on lang


auge is as expected.` ).
"#
EC NOTEXT

* tc->observe( `that the logged on clie


nt is as expected.` ).
"#
EC NOTEXT

*
"#
EC NOTEXT

* tc->field( name = 'SY_UNAME'


value = sy-uname ).
"#
EC NOTEXT

* tc->field( name = 'SY_MANDT'


value = sy-mandt ).
"#
EC NOTEXT

* tc->field( name = 'SY_LANGU'


value = sy-langu ).
"#
EC NOTEXT

* tc->field( name = 'SY_SYSID'


value = sy-sysid ).
"#
EC NOTEXT

* tc->field( name = 'SY_SAPRL'


value = sy-saprl ).
"#
EC NOTEXT

** tc->field( name = 'SY_DATUM'


value = sy-datum ).
"#
EC NOTEXT

** tc->field( name = 'SY_UZEIT'


value = sy-uzeit ).
"#
EC NOTEXT

* tc->field( name = 'SY_HOST'


value = sy-host ).
"#
EC NOTEXT

* tc->field( name = 'Http_fqBaseUrl'


value = tc->nwbc_runtime->full_qualified_b
ase_url ). "#
EC NOTEXT

* tc->field( name = 'Http_fqHost'


value = tc->nwbc_runtime->full_qualified_h
ost ). "#
EC NOTEXT

* tc->field( name = 'Http_BaseUrl'


value = tc->nwbc_runtime->base_url ).
"#
EC NOTEXT
* tc->field( name = 'Http_SessionId'
value = tc->server->session_id ).
"#
EC NOTEXT

* tc->field( name = 'Runtime_Version'


value = tc->nwbc_runtime->version ).
"#
EC NOTEXT

* tc->field( name = 'Runtime_Cockpit'


value = tc->nwbc_runtime->cockpit ).
"#
EC NOTEXT

* "#EC NOTEXT

* ENDMETHOD.
"#
EC NOTEXT

*
"#
EC NOTEXT

*
"#
EC NOTEXT

* METHOD api_non_sap_portal.
"#
EC NOTEXT

* tc->id( 'API.NON_SAP_PORTAL' ).
"#
EC NOTEXT

* tc->title( 'Test Case for Non-SAP Por


tal Integration' ).
"#
EC NOTEXT

* tc->overview( `For NON-SAP portal int


egration, the approach is used of running
NWBC for HTML` ). "#
EC NOTEXT

* tc->overview( `in an embedded mode. W


hat this test case does, is to simulate su
ch a "foreign"` ). "#
EC NOTEXT

* tc->overview( `portal and then loads


NWBC for HTML embedded.` ).
"#
EC NOTEXT

*
"#
EC NOTEXT

* tc->do( `click on the button to load


the test role in embedded mode.` ).
"#
EC NOTEXT

* tc->observe( `that the specified role


is loaded correctly in bottom part of pag
e.` ). "#
EC NOTEXT

* tc->observe( `that the rendering is c


orrect, with an imbedded shell rendered.`
). "#
EC NOTEXT
*
"#
EC NOTEXT

* tc->raw_html( `<iframe id="nwbc_for_h


tml" src="about:blank" style="width:100%;h
eight:500px"></iframe>` ). "#
EC NOTEXT

*
"#
EC NOTEXT

* DATA: url TYPE string.


"#
EC NOTEXT

* url = cl_nwbc=>url_construct( role =


'SAP_NWBC_TEST_ROLE' canvas__window = cl_n
wbc=>canvas__window__embedded ). "#
EC NOTEXT

* CONCATENATE `document.all.nwbc_for_ht
ml.src="` url `";` INTO url.
"#
EC NOTEXT

* tc->button( name = 'LoadRole' value =


url ).
"#
EC NOTEXT

* ENDMETHOD.
"#
EC NOTEXT

*
"#
EC NOTEXT

*
"#
EC NOTEXT

* METHOD api_atom.
"#
EC NOTEXT

* tc->id( 'API.ATOM' ).
"#
EC NOTEXT

* tc->title( 'Test Case for ~atom Feede


r' ).
"#
EC NOTEXT

* tc->overview( `The NWBC runtime expor


ts all roles in an ATOM feed (via URL /nwb
c/~atom)` ). "#
EC NOTEXT

* tc->overview( `to allow other portals


to integrate SAP role content via NWBC fo
r HTML.` ). "#
EC NOTEXT

* tc->overview( `This test case simulat


es such a "foreign" portal.` ).
"#
EC NOTEXT

*
"#
EC NOTEXT
* tc->do( `click on a button to load a
specific role.` ).
"#
EC NOTEXT

* tc->observe( `that the specified role


is loaded correctly in bottom part of pag
e.` ). "#
EC NOTEXT

* tc->repeat( `for all roles.` ).


"#
EC NOTEXT

*
"#
EC NOTEXT

* tc->raw_html( `<iframe id="nwbc_for_h


tml" src="about:blank" style="width:100%;h
eight:500px"></iframe>` ). "#
EC NOTEXT

* tc->javascript( function = `LoadURL(u


rl)` code = `document.all.nwbc_for_html.sr
c=url;` ). "#
EC NOTEXT

*
"#
EC NOTEXT

** Example XML snippet from ATOM feed.


"#
EC NOTEXT

** <entry>
"#
EC NOTEXT
** <title type="text">SAP NetWeaver
Business Client Test Role</title>

** <id>/nwbc/~atom/roles/list('SAP_
NWBC_TEST_ROLE')</id>

** <updated>2010-04-26T16:18:06Z</u
pdated>

** <link rel="edit" title="Link" hr


ef="list('SAP_NWBC_TEST_ROLE')" />

** <link rel="alternate" type="text


/html" href="http://ldciyi3.wdf.sap.corp:5
0033/nwbc/SAP_NWBC_TEST_ROLE/~canvas;windo
w=embedded/sitemap/?sap-client=000"/>

** </entry>

* DATA: code TYPE string.

* CONCATENATE

* `{crlf} var xmlDoc = testc


ase.XmlRequest("/nwbc/~atom/roles/list");`
"#
EC NOTEXT

* `{crlf} var links = xmlDoc


.getElementsByTagName("link");`
"#
EC NOTEXT

* `{crlf} for(var i=0; i<lin


ks.length; i++) {`
"#
EC NOTEXT

* `{crlf} var attrRel = l


inks[i].attributes[0].nodeValue;`
"#
EC NOTEXT

* `{crlf} var attrHref = l


inks[i].attributes[2].nodeValue;`
"#
EC NOTEXT

* `{crlf} if(attrRel == "a


lternate") {`
"#
EC NOTEXT

* `{crlf} var startPos =


attrHref.indexOf("/nwbc/") + 6;`
"#
EC NOTEXT

* `{crlf} var endPos =


attrHref.indexOf("/~canvas");`
"#
EC NOTEXT

* `{crlf} var roleName =


attrHref.substring(startPos, endPos);`
"#
EC NOTEXT
* `{crlf} testcase.addBu
tton(roleName,"testcase.LoadURL('"+attrHre
f+"');");` "#
EC NOTEXT

* `{crlf} }`
"#
EC NOTEXT

* `{crlf} }`
"#
EC NOTEXT

* INTO code.

* tc->javascript( code ).

* ENDMETHOD.

*
* METHOD api_slow_load.
"#
EC NOTEXT

* tc->id( 'API.SLOW_LOAD' ).
"#
EC NOTEXT

* tc->title( 'Test Case that Loads Very


Slowly' ).
"#
EC NOTEXT

* tc->overview( `This node is just a pa


ge that loads incredibly slow to test for
time-out situations,` ). "#
EC NOTEXT

* tc->overview( `especially with the au


tomated tested.` ).
"#
EC NOTEXT

* tc->observe( `that the canvas is load


ed correctly, that is sufficient.` ).
"#
EC NOTEXT

* WAIT UP TO 75 SECONDS.

* ENDMETHOD.
"#
EC NOTEXT
*

*ENDCLASS.

LIMU
CINC
CL_NWBC_RUNTIME35=============CCAU

00012

LIMU
CINC
CL_NWBC_RUNTIME35=============CCAU

00000

36
1
\\\\\no_empty_blocks/////
1
\\\\\comments_ignored/////
1
\\\\\delta_normalized/////
3
\\\\\allowed/////
FORM
*
3
\\\\\allowed/////
FUNCTION
*
3
\\\\\allowed/////
MODULE
**
3
\\\\\allowed/////
REPORT
*
3
\\\\\allowed/////
PROGRAM
*
3
\\\\\allowed/////
FUNCTION-POOL
*
4
\\\\\allowed/////
CLASS
*
DEFINITION
4
\\\\\allowed/////
CLASS
*
IMPLEMENTATION
5
\\\\\forbidden/////
CLASS
*
DEFINITION
DEFERRED
5
\\\\\forbidden/////
CLASS
*
DEFINITION
LOAD
6
\\\\\forbidden/////
CLASS
*
DEFINITION
LOCAL
FRIENDS
3
\\\\\allowed/////
AT
LINE-SELECTION
3
\\\\\allowed/////
AT
USER-COMMAND
4
\\\\\allowed/////
AT
SELECTION-SCREEN
**
3
\\\\\allowed/////
AT
PF*
2
\\\\\allowed/////
INITIALIZATION
2
\\\\\allowed/////
START-OF-SELECTION
2
\\\\\allowed/////
END-OF-SELECTION
3
\\\\\allowed/////
TOP-OF-PAGE
**
2
\\\\\allowed/////
END-OF-PAGE
3
\\\\\allowed/////
GET
**
3
\\\\\forbidden/////
GET
BADI
3
\\\\\forbidden/////
GET
BIT
3
\\\\\forbidden/////
GET
CONNECTION
3
\\\\\forbidden/////
GET
CURSOR
3
\\\\\forbidden/////
GET
DATASET
3
\\\\\forbidden/////
GET
LOCALE
3
\\\\\forbidden/////
GET
PARAMETER
3
\\\\\forbidden/////
GET
PF-STATUS
3
\\\\\forbidden/////
GET
PROPERTY
3
\\\\\forbidden/////
GET
REFERENCE
3
\\\\\forbidden/////
GET
RUN
3
\\\\\forbidden/////
GET
TIME
4
3
CLASS
CL_NWBC_OBN_PARAM_TEST
DEFINITION
1
1
0
21
CLASS cl_nwbc_obn_param_test DEFINITION FO
R TESTING

DURATION SHORT

RISK LEVEL HARMLESS FINAL

*?#<asx:abap xmlns:asx="http://www.sap.com
/abapxml" version="1.0">

*?<asx:values>

*?<TESTCLASS_OPTIONS>
*?<TEST_CLASS>cl_Nwbc_Obn_Param_Test

*?</TEST_CLASS>

*?<TEST_MEMBER>f_Cut

*?</TEST_MEMBER>

*?<OBJECT_UNDER_TEST>CL_NWBC

*?</OBJECT_UNDER_TEST>

*?<OBJECT_IS_LOCAL/>

*?<GENERATE_FIXTURE/>

*?<GENERATE_CLASS_FIXTURE/>
*?<GENERATE_INVOCATION/>

*?<GENERATE_ASSERT_EQUAL/>

*?</TESTCLASS_OPTIONS>

*?</asx:values>

*?</asx:abap>

5
CLASS cl_nwbc_obn_param_test DEFINITION FO
R TESTING FINAL

" DURATION SHORT RISK LEVEL HARMLESS -->


not supported in SAP_BASIS700

"#AU Duration Short


"#AU Risk_Level Harmless

3
CLASS
CL_NWBC_OBN_PARAM_TEST
IMPLEMENTATION
2
316
3
rv_unique_key = iv_unique_key.

ELSE.

"create unique id

1
rv_unique_key = cl_system_uuid=>
create_uuid_x16_static( ).

11
TRY.

CALL METHOD ('CL_SYSTEM_UUID


')=>create_uuid_x16_static

RECEIVING

uuid = rv_unique_key.

CATCH cx_sy_dyn_call_error.

DATA lv_guid16 TYPE guid_16.

CALL FUNCTION 'GUID_CREATE'

IMPORTING

ev_guid_16 = lv_guid16.

rv_unique_key = lv_guid16.
ENDTRY.

333
4
RAISE EXCEPTION TYPE cx_nwbc_stati
c_check

EXPORTING

textid = cx_nwbc_static_chec
k=>cx_obn_param_format_invalid

previous = lx_error.

1
CATCH cx_uuid_error INTO lx_error.

1
CATCH cx_root INTO lx_error.

3
CLASS
LC_UT_ASSOCIATED
DEFINITION
1
1
0
1
CLASS lc_ut_associated DEFINITION FOR TEST
ING DURATION SHORT RISK LEVEL HARMLESS FIN
AL.

5
CLASS lc_ut_associated DEFINITION FOR TEST
ING FINAL

" DURATION SHORT RISK LEVEL HARMLESS -->


not supported in SAP_BASIS700

"#AU Duration Short

"#AU Risk_Level Harmless

3
CLASS
LC_UT_ASSOCIATED
IMPLEMENTATION
3
13
3
IF lv_role_exist EQ abap_false.
DATA: lv_detail TYPE string.

CONCATENATE `Please import role ` mc


_associated_role ` from Y3S(111) system in
to ` sy-sysid `(` sy-mandt `)` ` to proces
s unit tests.` INTO lv_detail.

1
cl_abap_unit_assert=>abort( msg = `T
est role is not available.` detail = lv_de
tail ).

1
cl_aunit_assert=>abort( msg = `Test
role is not available.` detail = lv_detail
).

31
3
ENDMETHOD. "teardown

METHOD assert_equals.

1
assertion_failed = cl_abap_unit_assert
=>assert_equals( act = act exp = exp msg =
msg level = level ).
1
assertion_failed = cl_aunit_assert=>as
sert_equals( act = act exp = exp msg = msg
level = level ).

52
4
ENDIF.

<fs> = cl_nwbc_runtime35=>encode_uniqu
e_id( agr_name = lv_agr_name origin_id = l
v_origin_id ).

1
ENDMETHOD.

1
ENDMETHOD. "append_un
ique_id

LIMU
CINC
CL_NWBC_RUNTIME35=============CCIMP
00028

LIMU
CINC
CL_NWBC_RUNTIME35=============CCIMP

00000

36
1
\\\\\no_empty_blocks/////
1
\\\\\comments_not_ignored/////
1
\\\\\delta_normalized/////
3
\\\\\allowed/////
FORM
*
3
\\\\\allowed/////
FUNCTION
*
3
\\\\\allowed/////
MODULE
**
3
\\\\\allowed/////
REPORT
*
3
\\\\\allowed/////
PROGRAM
*
3
\\\\\allowed/////
FUNCTION-POOL
*
4
\\\\\allowed/////
CLASS
*
DEFINITION
4
\\\\\allowed/////
CLASS
*
IMPLEMENTATION
5
\\\\\forbidden/////
CLASS
*
DEFINITION
DEFERRED
5
\\\\\forbidden/////
CLASS
*
DEFINITION
LOAD
6
\\\\\forbidden/////
CLASS
*
DEFINITION
LOCAL
FRIENDS
3
\\\\\allowed/////
AT
LINE-SELECTION
3
\\\\\allowed/////
AT
USER-COMMAND
4
\\\\\allowed/////
AT
SELECTION-SCREEN
**
3
\\\\\allowed/////
AT
PF*
2
\\\\\allowed/////
INITIALIZATION
2
\\\\\allowed/////
START-OF-SELECTION
2
\\\\\allowed/////
END-OF-SELECTION
3
\\\\\allowed/////
TOP-OF-PAGE
**
2
\\\\\allowed/////
END-OF-PAGE
3
\\\\\allowed/////
GET
**
3
\\\\\forbidden/////
GET
BADI
3
\\\\\forbidden/////
GET
BIT
3
\\\\\forbidden/////
GET
CONNECTION
3
\\\\\forbidden/////
GET
CURSOR
3
\\\\\forbidden/////
GET
DATASET
3
\\\\\forbidden/////
GET
LOCALE
3
\\\\\forbidden/////
GET
PARAMETER
3
\\\\\forbidden/////
GET
PF-STATUS
3
\\\\\forbidden/////
GET
PROPERTY
3
\\\\\forbidden/////
GET
REFERENCE
3
\\\\\forbidden/////
GET
RUN
3
\\\\\forbidden/////
GET
TIME
3
3
CLASS
LCL_NWBC_NAV_TREE_ACCESS
DEFINITION
1
53
3

endclass. "lcl_nwbc_nav
_tree_access DEFINITION
1
*-----------------------------------------
-----------------------------*

*-----------------------------------------
-----------------------------*

3
CLASS
CL_GET_NAVIGATION_TREES_TEST
DEFINITION
1
1
0
4
class cl_get_navigation_trees_test definit
ion for testing

duration short

risk level harmless

final.
5
CLASS cl_get_navigation_trees_test DEFINIT
ION FOR TESTING FINAL

" DURATION SHORT RISK LEVEL HARMLESS ->


not supported on 700

"#AU Duration Short

"#AU Risk_Level Harmless

3
CLASS
CL_ENTERPRISE_SEARCH_TEST
DEFINITION
1
1
0
3
CLASS cl_enterprise_search_test DEFINITION
FOR TESTING

DURATION SHORT
RISK LEVEL HARMLESS FINAL.

5
CLASS cl_enterprise_search_test DEFINITION
FOR TESTING FINAL

" DURATION SHORT RISK LEVEL HARMLESS ->


not supported on 700

"#AU Duration Short

"#AU Risk_Level Harmless

0120031469
41
0001232980
0002
46
LIMU
CINC
CL_LSAPI_MANAGER==============CCIMP

00020

LIMU
CINC
CL_LSAPI_MANAGER==============CCIMP

00022

36
1
\\\\\no_empty_blocks/////
1
\\\\\comments_not_ignored/////
1
\\\\\delta_normalized/////
3
\\\\\allowed/////
FORM
*
3
\\\\\allowed/////
FUNCTION
*
3
\\\\\allowed/////
MODULE
**
3
\\\\\allowed/////
REPORT
*
3
\\\\\allowed/////
PROGRAM
*
3
\\\\\allowed/////
FUNCTION-POOL
*
4
\\\\\allowed/////
CLASS
*
DEFINITION
4
\\\\\allowed/////
CLASS
*
IMPLEMENTATION
5
\\\\\forbidden/////
CLASS
*
DEFINITION
DEFERRED
5
\\\\\forbidden/////
CLASS
*
DEFINITION
LOAD
6
\\\\\forbidden/////
CLASS
*
DEFINITION
LOCAL
FRIENDS
3
\\\\\allowed/////
AT
LINE-SELECTION
3
\\\\\allowed/////
AT
USER-COMMAND
4
\\\\\allowed/////
AT
SELECTION-SCREEN
**
3
\\\\\allowed/////
AT
PF*
2
\\\\\allowed/////
INITIALIZATION
2
\\\\\allowed/////
START-OF-SELECTION
2
\\\\\allowed/////
END-OF-SELECTION
3
\\\\\allowed/////
TOP-OF-PAGE
**
2
\\\\\allowed/////
END-OF-PAGE
3
\\\\\allowed/////
GET
**
3
\\\\\forbidden/////
GET
BADI
3
\\\\\forbidden/////
GET
BIT
3
\\\\\forbidden/////
GET
CONNECTION
3
\\\\\forbidden/////
GET
CURSOR
3
\\\\\forbidden/////
GET
DATASET
3
\\\\\forbidden/////
GET
LOCALE
3
\\\\\forbidden/////
GET
PARAMETER
3
\\\\\forbidden/////
GET
PF-STATUS
3
\\\\\forbidden/////
GET
PROPERTY
3
\\\\\forbidden/////
GET
REFERENCE
3
\\\\\forbidden/////
GET
RUN
3
\\\\\forbidden/////
GET
TIME
2
3
CLASS
LC_LSAPI_SAPGUI_STANDALONE
IMPLEMENTATION
3
29
3
lv_window_title = title.

lv_window_features = window_attributes
.
1
MOVE mode TO lv_navigation_mode.

5
" in SAP GUI standalone case we need t
o ignore sap-force_sapgui flag

cl_nwbc=>read_query_parameter( EXPORTI
NG iv_name = if_lsapi=>mc_tr_force_sapgui
iv_delete = abap_true

CHANGIN
G cv_url = lv_location ct_post = lt_fiel
ds ).

MOVE mode TO lv_navigation_mode.

57
3
lv_tr_name = lv_tr.
LOOP AT lt_fields ASSIGNING <param>.

1
ls_gui_param-parid = <param>-nam
e.

2
CHECK <param>-name NE if_lsapi=>mc
_tr_force_sapgui.

ls_gui_param-parid = <param>-nam
e.

84
7
CALL FUNCTION 'ABAP4_CALL_TRANSACT
ION' STARTING NEW TASK 'TEST'

EXPORTING

tcode = lv_t
r_name

skip_screen = lv_s
kip_sel_screen
TABLES

spagpa_tab = lt_g
ui_param

EXCEPTIONS

3
call_transaction_denied = 1

tcode_invalid = 2

OTHERS = 3.

1
OTHERS.

3
CLASS
LC_LSAPI_SAPGUI_NWBC
IMPLEMENTATION
2
92
4
ENDMETHOD. "is_lscont
ext_supported
METHOD constructor.

3
DATA: clsid(80),

event_tab TYPE cntl_simp


le_events,

event_tab_line TYPE cntl_simp


le_event.

1
DATA: clsid(80).

144
3
lv_context_string = me->get_context(
).
cl_nwbc=>context_set_from_http_reque
st( context_string = lv_context_string ).

ELSE.

1
cl_nwbc=>initialize_client( version
= 'SAP GUI 7.20' sb_nwbc_navigate = abap_t
rue ).

1
cl_nwbc=>initialize_client( version
= 'SAP GUI 7.20' sb_nwbc_navigate = abap_t
rue nwbc_shell = cl_nwbc=>for_desktop ).

LIMU
CINC
CL_NWBC_RUNTIME35=============CCAU

00010

LIMU
CINC
CL_NWBC_RUNTIME35=============CCAU

00012

36
1
\\\\\no_empty_blocks/////
1
\\\\\comments_ignored/////
1
\\\\\delta_normalized/////
3
\\\\\allowed/////
FORM
*
3
\\\\\allowed/////
FUNCTION
*
3
\\\\\allowed/////
MODULE
**
3
\\\\\allowed/////
REPORT
*
3
\\\\\allowed/////
PROGRAM
*
3
\\\\\allowed/////
FUNCTION-POOL
*
4
\\\\\allowed/////
CLASS
*
DEFINITION
4
\\\\\allowed/////
CLASS
*
IMPLEMENTATION
5
\\\\\forbidden/////
CLASS
*
DEFINITION
DEFERRED
5
\\\\\forbidden/////
CLASS
*
DEFINITION
LOAD
6
\\\\\forbidden/////
CLASS
*
DEFINITION
LOCAL
FRIENDS
3
\\\\\allowed/////
AT
LINE-SELECTION
3
\\\\\allowed/////
AT
USER-COMMAND
4
\\\\\allowed/////
AT
SELECTION-SCREEN
**
3
\\\\\allowed/////
AT
PF*
2
\\\\\allowed/////
INITIALIZATION
2
\\\\\allowed/////
START-OF-SELECTION
2
\\\\\allowed/////
END-OF-SELECTION
3
\\\\\allowed/////
TOP-OF-PAGE
**
2
\\\\\allowed/////
END-OF-PAGE
3
\\\\\allowed/////
GET
**
3
\\\\\forbidden/////
GET
BADI
3
\\\\\forbidden/////
GET
BIT
3
\\\\\forbidden/////
GET
CONNECTION
3
\\\\\forbidden/////
GET
CURSOR
3
\\\\\forbidden/////
GET
DATASET
3
\\\\\forbidden/////
GET
LOCALE
3
\\\\\forbidden/////
GET
PARAMETER
3
\\\\\forbidden/////
GET
PF-STATUS
3
\\\\\forbidden/////
GET
PROPERTY
3
\\\\\forbidden/////
GET
REFERENCE
3
\\\\\forbidden/////
GET
RUN
3
\\\\\forbidden/////
GET
TIME
1
3
CLASS
LC_UT_ASSOCIATED
DEFINITION
1
1
0
22
CLASS lc_ut_associated DEFINITION FOR TEST
ING DURATION SHORT RISK LEVEL HARMLESS.

*?#<asx:abap xmlns:asx="http://www.sap.com
/abapxml" version="1.0">

*?<asx:values>

*?<TESTCLASS_OPTIONS>

*?<TEST_CLASS>lc_ut_associated
*?</TEST_CLASS>

*?<TEST_MEMBER>f_Cut

*?</TEST_MEMBER>

*?<OBJECT_UNDER_TEST>CL_NWBC_RUNTIME35

*?</OBJECT_UNDER_TEST>

*?<OBJECT_IS_LOCAL/>

*?<GENERATE_FIXTURE>X

*?</GENERATE_FIXTURE>

*?<GENERATE_CLASS_FIXTURE>X
*?</GENERATE_CLASS_FIXTURE>

*?<GENERATE_INVOCATION>X

*?</GENERATE_INVOCATION>

*?<GENERATE_ASSERT_EQUAL>X

*?</GENERATE_ASSERT_EQUAL>

*?</TESTCLASS_OPTIONS>

*?</asx:values>

*?</asx:abap>

1
CLASS lc_ut_associated DEFINITION FOR TEST
ING DURATION SHORT RISK LEVEL HARMLESS FIN
AL.

LIMU
CINC
CL_NWBC_RUNTIME35=============CCIMP

00026

LIMU
CINC
CL_NWBC_RUNTIME35=============CCIMP

00028

36
1
\\\\\no_empty_blocks/////
1
\\\\\comments_not_ignored/////
1
\\\\\delta_normalized/////
3
\\\\\allowed/////
FORM
*
3
\\\\\allowed/////
FUNCTION
*
3
\\\\\allowed/////
MODULE
**
3
\\\\\allowed/////
REPORT
*
3
\\\\\allowed/////
PROGRAM
*
3
\\\\\allowed/////
FUNCTION-POOL
*
4
\\\\\allowed/////
CLASS
*
DEFINITION
4
\\\\\allowed/////
CLASS
*
IMPLEMENTATION
5
\\\\\forbidden/////
CLASS
*
DEFINITION
DEFERRED
5
\\\\\forbidden/////
CLASS
*
DEFINITION
LOAD
6
\\\\\forbidden/////
CLASS
*
DEFINITION
LOCAL
FRIENDS
3
\\\\\allowed/////
AT
LINE-SELECTION
3
\\\\\allowed/////
AT
USER-COMMAND
4
\\\\\allowed/////
AT
SELECTION-SCREEN
**
3
\\\\\allowed/////
AT
PF*
2
\\\\\allowed/////
INITIALIZATION
2
\\\\\allowed/////
START-OF-SELECTION
2
\\\\\allowed/////
END-OF-SELECTION
3
\\\\\allowed/////
TOP-OF-PAGE
**
2
\\\\\allowed/////
END-OF-PAGE
3
\\\\\allowed/////
GET
**
3
\\\\\forbidden/////
GET
BADI
3
\\\\\forbidden/////
GET
BIT
3
\\\\\forbidden/////
GET
CONNECTION
3
\\\\\forbidden/////
GET
CURSOR
3
\\\\\forbidden/////
GET
DATASET
3
\\\\\forbidden/////
GET
LOCALE
3
\\\\\forbidden/////
GET
PARAMETER
3
\\\\\forbidden/////
GET
PF-STATUS
3
\\\\\forbidden/////
GET
PROPERTY
3
\\\\\forbidden/////
GET
REFERENCE
3
\\\\\forbidden/////
GET
RUN
3
\\\\\forbidden/////
GET
TIME
1
3
CLASS
CL_GET_NAVIGATION_TREES_TEST
IMPLEMENTATION
2
8
5
data: lo_nwbc_runtime type ref to if_n
wbc_runtime,
lo_nwbc_runtime35 type ref to if
_nwbc_runtime35,

lo_cl_nwbc_runtime type ref to c


l_nwbc_runtime35,

lt_sap_menu type if_nwbc_runtime


=>t_navigation_tree,

ls_sap_menu_info type if_nwbc_ru


ntime=>t_navigation_tree_info,

2
ls_sap_menu_info_internal type c
l_nwbc_runtime35=>t_sap_menu_info,

ls_user_info type if_nwbc_runtim


e=>t_user_info.

1
ls_sap_menu_info_internal type c
l_nwbc_runtime35=>t_sap_menu_info.

16
4
assert lo_nwbc_runtime is not initial.
"get rid of any buffer

lo_cl_nwbc_runtime ?= lo_nwbc_runtime.

ls_sap_menu_info_internal = lo_cl_nwbc
_runtime->get_sap_menu_info( ).

2
ls_user_info = lo_nwbc_runtime->get_us
er_info( ).

delete from database nwbc_nav_tree(nt)


id ls_sap_menu_info_internal-cluster_id.

1
delete from database nwbc_nav_tree(nt)
id ls_sap_menu_info_internal-cluster_id.

LIMU
CINC
CL_NWBC_SAPGUI_SHORTCUT=======CCAU

99997

LIMU
CINC
CL_NWBC_SAPGUI_SHORTCUT=======CCAU
00002

31
1
\\\\\no_empty_blocks/////
1
\\\\\comments_not_ignored/////
1
\\\\\delta_normalized/////
3
\\\\\allowed/////
FORM
*
3
\\\\\allowed/////
FUNCTION
*
3
\\\\\allowed/////
MODULE
**
3
\\\\\allowed/////
REPORT
*
3
\\\\\allowed/////
PROGRAM
*
3
\\\\\allowed/////
FUNCTION-POOL
*
3
\\\\\allowed/////
AT
LINE-SELECTION
3
\\\\\allowed/////
AT
USER-COMMAND
4
\\\\\allowed/////
AT
SELECTION-SCREEN
**
3
\\\\\allowed/////
AT
PF*
2
\\\\\allowed/////
INITIALIZATION
2
\\\\\allowed/////
START-OF-SELECTION
2
\\\\\allowed/////
END-OF-SELECTION
3
\\\\\allowed/////
TOP-OF-PAGE
**
2
\\\\\allowed/////
END-OF-PAGE
3
\\\\\allowed/////
GET
**
3
\\\\\forbidden/////
GET
BADI
3
\\\\\forbidden/////
GET
BIT
3
\\\\\forbidden/////
GET
CONNECTION
3
\\\\\forbidden/////
GET
CURSOR
3
\\\\\forbidden/////
GET
DATASET
3
\\\\\forbidden/////
GET
LOCALE
3
\\\\\forbidden/////
GET
PARAMETER
3
\\\\\forbidden/////
GET
PF-STATUS
3
\\\\\forbidden/////
GET
PROPERTY
3
\\\\\forbidden/////
GET
REFERENCE
3
\\\\\forbidden/////
GET
RUN
3
\\\\\forbidden/////
GET
TIME
1
0
1
1
0
0
68
*"* use this source file for your ABAP uni
t test classes

CLASS lc_sapgui_shortcut_test DEFINITION F


OR TESTING FINAL.

PRIVATE SECTION.

METHODS: setup.

METHODS: teardown.

METHODS: get_shortcut FOR TESTING.

ENDCLASS. "lc_sapgui_shortcut_test
*-----------------------------------------
-----------------------------*

* CLASS lc_sapgui_shortcut_test IMPL


EMENTATION

*-----------------------------------------
-----------------------------*

*-----------------------------------------
-----------------------------*

CLASS lc_sapgui_shortcut_test IMPLEMENTATI


ON.
METHOD setup.

ENDMETHOD. "setup

METHOD teardown.

ENDMETHOD. "teardown
METHOD get_shortcut.

DATA:

lo_shortcut TYPE REF TO cl_nwbc_sapg


ui_shortcut,

* lt_exp TYPE string_table,

lt_act TYPE string_table.

* CREATE OBJECT lo_shortcut

* EXPORTING
* iv_system_id = SY-SYSID

* iv_client_id = SY-MANDT

* iv_system_description =

* iv_application_server_name =

* iv_system_number =

* it_gateway_hosts =

* iv_message_server_name =

* iv_service_port =
* iv_logon_group =

* iv_sm59_destination =

* iv_report_name =

* iv_report_variant =

* iv_title =

* iv_system_command =

* iv_transaction_code =

* iv_skip_initial_screen = ABAP_FAL
SE

* it_parameters =
* iv_user_id = SY-UNAME

* iv_language = SY-LANGU

* iv_password =

* iv_trace_level = CL_NWBC_SAPGUI_S
HORTCUT=>SC_NO_TRACE

* iv_work_directory =

* iv_gui_size = CL_NWBC_SAPGUI_SHOR
TCUT=>SC_GUI_SIZE_NORMAL_WINDOW

* iv_reuse_existing_connection = AB
AP_TRUE

* .
CREATE OBJECT lo_shortcut EXPORTING iv
_transaction_code = 'se38'.

lo_shortcut->get_shortcut( IMPORTING e
t_shortcut = lt_act ).

cl_abap_unit_assert=>assert_not_initia
l( act = lt_act msg = 'Basics SAPGUI shotc
ut generation failed!').

ENDMETHOD. "get_Shortcut

ENDCLASS. "lc_sapgui_shortcut_test
LIMU
CINC
CL_NWBC_SAPGUI_SHORTCUT=======CCDEF

99997

LIMU
CINC
CL_NWBC_SAPGUI_SHORTCUT=======CCDEF

00002

36
1
\\\\\no_empty_blocks/////
1
\\\\\comments_not_ignored/////
1
\\\\\delta_normalized/////
3
\\\\\allowed/////
FORM
*
3
\\\\\allowed/////
FUNCTION
*
3
\\\\\allowed/////
MODULE
**
3
\\\\\allowed/////
REPORT
*
3
\\\\\allowed/////
PROGRAM
*
3
\\\\\allowed/////
FUNCTION-POOL
*
4
\\\\\allowed/////
CLASS
*
DEFINITION
4
\\\\\allowed/////
CLASS
*
IMPLEMENTATION
5
\\\\\forbidden/////
CLASS
*
DEFINITION
DEFERRED
5
\\\\\forbidden/////
CLASS
*
DEFINITION
LOAD
6
\\\\\forbidden/////
CLASS
*
DEFINITION
LOCAL
FRIENDS
3
\\\\\allowed/////
AT
LINE-SELECTION
3
\\\\\allowed/////
AT
USER-COMMAND
4
\\\\\allowed/////
AT
SELECTION-SCREEN
**
3
\\\\\allowed/////
AT
PF*
2
\\\\\allowed/////
INITIALIZATION
2
\\\\\allowed/////
START-OF-SELECTION
2
\\\\\allowed/////
END-OF-SELECTION
3
\\\\\allowed/////
TOP-OF-PAGE
**
2
\\\\\allowed/////
END-OF-PAGE
3
\\\\\allowed/////
GET
**
3
\\\\\forbidden/////
GET
BADI
3
\\\\\forbidden/////
GET
BIT
3
\\\\\forbidden/////
GET
CONNECTION
3
\\\\\forbidden/////
GET
CURSOR
3
\\\\\forbidden/////
GET
DATASET
3
\\\\\forbidden/////
GET
LOCALE
3
\\\\\forbidden/////
GET
PARAMETER
3
\\\\\forbidden/////
GET
PF-STATUS
3
\\\\\forbidden/////
GET
PROPERTY
3
\\\\\forbidden/////
GET
REFERENCE
3
\\\\\forbidden/////
GET
RUN
3
\\\\\forbidden/////
GET
TIME
0
LIMU
CINC
CL_NWBC_SAPGUI_SHORTCUT=======CCIMP

99997

LIMU
CINC
CL_NWBC_SAPGUI_SHORTCUT=======CCIMP

00002
36
1
\\\\\no_empty_blocks/////
1
\\\\\comments_not_ignored/////
1
\\\\\delta_normalized/////
3
\\\\\allowed/////
FORM
*
3
\\\\\allowed/////
FUNCTION
*
3
\\\\\allowed/////
MODULE
**
3
\\\\\allowed/////
REPORT
*
3
\\\\\allowed/////
PROGRAM
*
3
\\\\\allowed/////
FUNCTION-POOL
*
4
\\\\\allowed/////
CLASS
*
DEFINITION
4
\\\\\allowed/////
CLASS
*
IMPLEMENTATION
5
\\\\\forbidden/////
CLASS
*
DEFINITION
DEFERRED
5
\\\\\forbidden/////
CLASS
*
DEFINITION
LOAD
6
\\\\\forbidden/////
CLASS
*
DEFINITION
LOCAL
FRIENDS
3
\\\\\allowed/////
AT
LINE-SELECTION
3
\\\\\allowed/////
AT
USER-COMMAND
4
\\\\\allowed/////
AT
SELECTION-SCREEN
**
3
\\\\\allowed/////
AT
PF*
2
\\\\\allowed/////
INITIALIZATION
2
\\\\\allowed/////
START-OF-SELECTION
2
\\\\\allowed/////
END-OF-SELECTION
3
\\\\\allowed/////
TOP-OF-PAGE
**
2
\\\\\allowed/////
END-OF-PAGE
3
\\\\\allowed/////
GET
**
3
\\\\\forbidden/////
GET
BADI
3
\\\\\forbidden/////
GET
BIT
3
\\\\\forbidden/////
GET
CONNECTION
3
\\\\\forbidden/////
GET
CURSOR
3
\\\\\forbidden/////
GET
DATASET
3
\\\\\forbidden/////
GET
LOCALE
3
\\\\\forbidden/////
GET
PARAMETER
3
\\\\\forbidden/////
GET
PF-STATUS
3
\\\\\forbidden/////
GET
PROPERTY
3
\\\\\forbidden/////
GET
REFERENCE
3
\\\\\forbidden/////
GET
RUN
3
\\\\\forbidden/////
GET
TIME
0
LIMU
CINC
CL_NWBC_SAPGUI_SHORTCUT=======CCMAC

99997

LIMU
CINC
CL_NWBC_SAPGUI_SHORTCUT=======CCMAC

00002

36
1
\\\\\no_empty_blocks/////
1
\\\\\comments_not_ignored/////
1
\\\\\delta_normalized/////
3
\\\\\allowed/////
FORM
*
3
\\\\\allowed/////
FUNCTION
*
3
\\\\\allowed/////
MODULE
**
3
\\\\\allowed/////
REPORT
*
3
\\\\\allowed/////
PROGRAM
*
3
\\\\\allowed/////
FUNCTION-POOL
*
4
\\\\\allowed/////
CLASS
*
DEFINITION
4
\\\\\allowed/////
CLASS
*
IMPLEMENTATION
5
\\\\\forbidden/////
CLASS
*
DEFINITION
DEFERRED
5
\\\\\forbidden/////
CLASS
*
DEFINITION
LOAD
6
\\\\\forbidden/////
CLASS
*
DEFINITION
LOCAL
FRIENDS
3
\\\\\allowed/////
AT
LINE-SELECTION
3
\\\\\allowed/////
AT
USER-COMMAND
4
\\\\\allowed/////
AT
SELECTION-SCREEN
**
3
\\\\\allowed/////
AT
PF*
2
\\\\\allowed/////
INITIALIZATION
2
\\\\\allowed/////
START-OF-SELECTION
2
\\\\\allowed/////
END-OF-SELECTION
3
\\\\\allowed/////
TOP-OF-PAGE
**
2
\\\\\allowed/////
END-OF-PAGE
3
\\\\\allowed/////
GET
**
3
\\\\\forbidden/////
GET
BADI
3
\\\\\forbidden/////
GET
BIT
3
\\\\\forbidden/////
GET
CONNECTION
3
\\\\\forbidden/////
GET
CURSOR
3
\\\\\forbidden/////
GET
DATASET
3
\\\\\forbidden/////
GET
LOCALE
3
\\\\\forbidden/////
GET
PARAMETER
3
\\\\\forbidden/////
GET
PF-STATUS
3
\\\\\forbidden/////
GET
PROPERTY
3
\\\\\forbidden/////
GET
REFERENCE
3
\\\\\forbidden/////
GET
RUN
3
\\\\\forbidden/////
GET
TIME
0
LIMU
CINC
CL_URL========================CCAU

99997

LIMU
CINC
CL_URL========================CCAU

00002

31
1
\\\\\no_empty_blocks/////
1
\\\\\comments_ignored/////
1
\\\\\delta_normalized/////
3
\\\\\allowed/////
FORM
*
3
\\\\\allowed/////
FUNCTION
*
3
\\\\\allowed/////
MODULE
**
3
\\\\\allowed/////
REPORT
*
3
\\\\\allowed/////
PROGRAM
*
3
\\\\\allowed/////
FUNCTION-POOL
*
3
\\\\\allowed/////
AT
LINE-SELECTION
3
\\\\\allowed/////
AT
USER-COMMAND
4
\\\\\allowed/////
AT
SELECTION-SCREEN
**
3
\\\\\allowed/////
AT
PF*
2
\\\\\allowed/////
INITIALIZATION
2
\\\\\allowed/////
START-OF-SELECTION
2
\\\\\allowed/////
END-OF-SELECTION
3
\\\\\allowed/////
TOP-OF-PAGE
**
2
\\\\\allowed/////
END-OF-PAGE
3
\\\\\allowed/////
GET
**
3
\\\\\forbidden/////
GET
BADI
3
\\\\\forbidden/////
GET
BIT
3
\\\\\forbidden/////
GET
CONNECTION
3
\\\\\forbidden/////
GET
CURSOR
3
\\\\\forbidden/////
GET
DATASET
3
\\\\\forbidden/////
GET
LOCALE
3
\\\\\forbidden/////
GET
PARAMETER
3
\\\\\forbidden/////
GET
PF-STATUS
3
\\\\\forbidden/////
GET
PROPERTY
3
\\\\\forbidden/////
GET
REFERENCE
3
\\\\\forbidden/////
GET
RUN
3
\\\\\forbidden/////
GET
TIME
1
0
1
1
0
0
107

*-----------------------------------------
-----------------------------*

* CLASS lc_Url_Test DEFINITION

*-----------------------------------------
-----------------------------*

*
*-----------------------------------------
-----------------------------*

CLASS lc_url_test DEFINITION FOR TESTING F


INAL.

PRIVATE SECTION.

DATA: lo_url TYPE REF TO cl_url. "cla


ss under test

METHODS: setup.

METHODS: teardown.

METHODS: get_transaction_name FOR TEST


ING.
METHODS: get_wda_name FOR TESTING.

ENDCLASS. "lc_url_test

*-----------------------------------------
-----------------------------*

* CLASS lc_url_test IMPLEMENTATION

*-----------------------------------------
-----------------------------*
*

*-----------------------------------------
-----------------------------*

CLASS lc_url_test IMPLEMENTATION.

METHOD setup.

CREATE OBJECT lo_url.

ENDMETHOD. "setup
METHOD teardown.

ENDMETHOD. "teardown

METHOD get_transaction_name.

DATA: ev_name TYPE string,

ev_skip_sel_screen TYPE abap_boo


l,

et_parameters TYPE tihttpnv


p,

lt_parameters LIKE et_param


eters.
FIELD-SYMBOLS: <param> LIKE LINE OF
lt_parameters.

""""""""""""""""""""""""""""""""""""""
""""""""""""""""""""""""""

" test transaction exctraction with sk


ip selection scring, parameters and encodi
ng

cl_url=>get_transaction_name( EXPORTIN
G iv_url = 'https://ldciq7k.wdf.sap.corp:4
4304/sap/bc/gui/sap/its/webgui;~sysid=Q7K;
~service=3204?~transaction=*ICLCDC02+PAR1%
3D%C3%84R%3B%2FPAR2%2FX%3D%C3%9C%3BDYNP_OK
CODE%3Ddo-it'
IMPORTIN
G ev_name = ev_name ev_skip_sel_screen = e
v_skip_sel_screen et_parameters = et_param
eters ).

cl_abap_unit_assert=>assert_equals( ac
t = ev_name exp = 'ICLCDC02' msg = 'Transa
ction name is wrong!' ).
cl_abap_unit_assert=>assert_equals( ac
t = ev_skip_sel_screen exp = abap_true msg
= 'Skip Selection Screen is not recognize
d' ).

CLEAR lt_parameters.

APPEND INITIAL LINE TO lt_parameters A


SSIGNING <param>.

<param>-name = 'PAR1'. <param>-value =


'R'. "#EC STRING_OK

APPEND INITIAL LINE TO lt_parameters A


SSIGNING <param>.

<param>-name = '/PAR2/X'. <param>-valu


e = ''. "#EC STRING_OK

APPEND INITIAL LINE TO lt_parameters A


SSIGNING <param>.

<param>-name = 'DYNP_OKCODE'. <param>-


value = 'do-it'.

cl_abap_unit_assert=>assert_equals( ac
t = et_parameters exp = lt_parameters msg
= 'Transaction paramaters parsed incorrect
ly').

""""""""""""""""""""""""""""""""""""""
""""""""""""""""""""""""""

" test transaction exctraction with ex


tra percentage encoding for skip selection
string and space

cl_url=>get_transaction_name( EXPORTIN
G iv_url = 'https://ldciq7k.wdf.sap.corp:4
4304/sap/bc/gui/sap/its/webgui;~sysid=Q7K;
~service=3204?~transaction=%2AICLCDC02%20P
AR1%3D%C3%84R%3B%2FPAR2%2FX%3D%C3%9C%3BDYN
P_OKCODE%3DDOIT'
IMPORTIN
G ev_name = ev_name ev_skip_sel_screen = e
v_skip_sel_screen et_parameters = et_param
eters ).

cl_abap_unit_assert=>assert_equals( ac
t = ev_name exp = 'ICLCDC02' msg = 'Transa
ction name is wrong!' ).
cl_abap_unit_assert=>assert_equals( ac
t = ev_skip_sel_screen exp = abap_true msg
= 'Skip Selection Screen is not recognize
d' ).

CLEAR lt_parameters.

APPEND INITIAL LINE TO lt_parameters A


SSIGNING <param>.

<param>-name = 'PAR1'. <param>-value =


'R'. "#EC STRING_OK

APPEND INITIAL LINE TO lt_parameters A


SSIGNING <param>.

<param>-name = '/PAR2/X'. <param>-valu


e = ''. "#EC STRING_OK

APPEND INITIAL LINE TO lt_parameters A


SSIGNING <param>.

<param>-name = 'DYNP_OKCODE'. <param>-


value = 'DOIT'.
cl_abap_unit_assert=>assert_equals( ac
t = et_parameters exp = lt_parameters msg
= 'Transaction paramaters parsed incorrect
ly').

""""""""""""""""""""""""""""""""""""""
""""""""""""""""""""""""""

" test transaction exctraction with re


lative url and space percentage encoding

cl_url=>get_transaction_name( EXPORTIN
G iv_url = '/sap/bc/gui/sap/its/webgui;~sy
sid=Q7K?~transaction=ICLCDC02%20PAR1%3D%C3
%84R%3B%2FPAR2%2FX%3D%C3%9C%3B'

IMPORTIN
G ev_name = ev_name ev_skip_sel_screen = e
v_skip_sel_screen et_parameters = et_param
eters ).

cl_abap_unit_assert=>assert_equals( ac
t = ev_name exp = 'ICLCDC02' msg = 'Transa
ction name is wrong!' ).
cl_abap_unit_assert=>assert_equals( ac
t = ev_skip_sel_screen exp = abap_false ms
g = 'Skip Selection Screen is not recogniz
ed' ).

CLEAR lt_parameters.

APPEND INITIAL LINE TO lt_parameters A


SSIGNING <param>.

<param>-name = 'PAR1'. <param>-value =


'R'. "#EC STRING_OK

APPEND INITIAL LINE TO lt_parameters A


SSIGNING <param>.

<param>-name = '/PAR2/X'. <param>-valu


e = ''. "#EC STRING_OK

cl_abap_unit_assert=>assert_equals( ac
t = et_parameters exp = lt_parameters msg
= 'Transaction paramaters parsed incorrect
ly').
ENDMETHOD. "get_transaction_name

METHOD get_wda_name.

DATA: rv_name TYPE string.

""""""""""""""""""""""""""""""""""""""
""""""""""""""""""""""""""
" test WDA exctraction with relative p
ath

rv_name = cl_url=>get_wda_name( iv_url


= '/sap/bc/webdynpro/SAP/FPM_WIRE_TEST_OV
P?sap-wd-configId=FPM_WIRE_TEST_OVP_APPCC&
sap-client=100&sap-language=EN' ).

cl_abap_unit_assert=>assert_equals( ac
t = rv_name exp = 'FPM_WIRE_TEST_OVP\FPM_W
IRE_TEST_OVP_APPCC' msg = 'WDA name/config
uration is wrong!' ).

ENDMETHOD. "get_wda_name

ENDCLASS. "lc_url_test

LIMU
METH
CL_LSAPI_MANAGER GET_INSTANCE
00008

LIMU
METH
CL_LSAPI_MANAGER GET_INSTANCE

00010

3
1
\\\\\no_empty_blocks/////
1
\\\\\comments_not_ignored/////
1
\\\\\delta_normalized/////
1
0
2
6
3
IF m_instance IS NOT BOUND.

DATA: retval TYPE sydebug,

2
retval_its TYPE sydebug,

ls_context TYPE cl_nwbc=>t_co


ntext.
1
ls_context TYPE cl_nwbc=>t_co
ntext.

11
3

CALL FUNCTION 'ICF_IS_PLUGIN_SESSION


'

IMPORTING

2
plugin_session = retval

its_plugin_session = retval_its.

1
plugin_session = retval.

LIMU
METH
CL_LSAPI_MANAGER NAVIGATE_TO_
TRANSACTION
00002
LIMU
METH
CL_LSAPI_MANAGER NAVIGATE_TO_
TRANSACTION
00004

3
1
\\\\\no_empty_blocks/////
1
\\\\\comments_not_ignored/////
1
\\\\\delta_normalized/////
1
0
1
22
4
ENDIF.

CONCATENATE if_lsapi=>gc_s_protocol-tran
saction lv_sm59_alias `~` lv_transaction I
NTO url.

1
IF url IS NOT REQUESTED.

8
IF force_sapgui IS SUPPLIED.
cl_nwbc=>replace_query_parameter( EXPO
RTING param_name = if_lsapi=>mc_tr_forc
e_sapgui

param_value = force_sapgui

param_default = abap_false

CHAN
GING url = url ).

ENDIF.

IF url IS NOT REQUESTED.

LIMU
METH
CL_NWBC INITIALIZE_C
LIENT
00005

LIMU
METH
CL_NWBC INITIALIZE_C
LIENT
00007

3
1
\\\\\no_empty_blocks/////
1
\\\\\comments_not_ignored/////
1
\\\\\delta_normalized/////
1
0
3
7
3
ls_context = context_get( ).

IF ls_context-valid EQ abap_false.

ls_context-valid = abap_true.

ls_context-nwbc_shell = cl_nwbc=>for_h
tml.

3
ev_already_initialized = abap_false.

ls_context-valid = abap_true.

ls_context-nwbc_shell = nwbc_shell.

32
3
IF sb_nwbc_tab_browsing IS SUPPLIED.

cl_lsapi_manager=>set_supported( EXP
ORTING feature = if_lsapi=>mc_feature_nwbc
_tab_browsing

set = sb_nwbc_tab_browsing

4
CHA
NGING support_bits = ls_context-support_bi
ts ).

ENDIF.
" when everything is updated, set sess
ion context

10
CHA
NGING support_bits = ls_context-support_bi
ts ).

ENDIF.

IF sb_nwbc_native_sapgui IS SUPPLIED.

cl_lsapi_manager=>set_supported( EXP
ORTING feature = if_lsapi=>mc_feature_nwbc
_native_sapgui

set = sb_nwbc_native_sapgui
CHA
NGING support_bits = ls_context-support_bi
ts ).

ENDIF.

" when everything is updated, set sess


ion context

39
3
context_set( is_context = ls_context )
.

ELSE.

1
RAISE already_initialized.
1
ev_already_initialized = abap_true.

LIMU
METH
CL_NWBC READ_QUERY_P
ARAMETER
00014

LIMU
METH
CL_NWBC READ_QUERY_P
ARAMETER
00016

3
1
\\\\\no_empty_blocks/////
1
\\\\\comments_not_ignored/////
1
\\\\\delta_normalized/////
1
0
2
5
4
METHOD read_query_parameter.

DATA: lv_query TYPE string,

lv_subrc LIKE sy-subrc,


2
lv_params TYPE string,

lt_fields TYPE tihttpnvp.

1
lt_fields TYPE tihttpnvp.

36
4
DELETE TABLE lt_fields WITH TABLE KE
Y name = iv_name.

ENDIF.

ENDIF.

3
IF cv_get IS SUPPLIED.

cv_get = cl_nwbc_utility=>fields_to_st
ring( lt_fields ).

ELSEIF cv_url IS SUPPLIED.

2
cv_get = cl_nwbc_utility=>fields_to_stri
ng( lt_fields ).

IF cv_url IS SUPPLIED.

LIMU
METH
CL_NWBC REPLACE_QUER
Y_PARAMETER
00007

LIMU
METH
CL_NWBC REPLACE_QUER
Y_PARAMETER
00009

3
1
\\\\\no_empty_blocks/////
1
\\\\\comments_not_ignored/////
1
\\\\\delta_normalized/////
1
0
1
28
3
<ff>-value = param_value.

ENDIF.

1
lv_params = cl_nwbc_utility=>fields_to_s
tring( lt_fields ).

6
IF param_default IS SUPPLIED AND param_v
alue EQ param_default.

DELETE TABLE post_body WITH TABLE KEY


name = param_name.

DELETE TABLE lt_fields WITH TABLE KEY


name = param_name.

ENDIF.
lv_params = cl_nwbc_utility=>fields_to_s
tring( lt_fields ).

LIMU
METH
CL_NWBC_HTML_BASE INITIALIZE

00021

LIMU
METH
CL_NWBC_HTML_BASE INITIALIZE

00023

3
1
\\\\\no_empty_blocks/////
1
\\\\\comments_not_ignored/////
1
\\\\\delta_normalized/////
1
0
1
14
4
cl_nwbc=>initialize_client(

exporting

version = lv_client_ve
rsion
sb_nwbc_obn = abap_true

3
sb_nwbc_navigate = abap_true

exceptions

already_initialized = 1 ).

1
sb_nwbc_navigate = abap_true ).

LIMU
METH
CL_NWBC_HTTP HANDLE_LAUNC
H
00016

LIMU
METH
CL_NWBC_HTTP HANDLE_LAUNC
H
00018

3
1
\\\\\no_empty_blocks/////
1
\\\\\comments_not_ignored/////
1
\\\\\delta_normalized/////
1
0
1
83
5
DATA:

lv_url_start TYPE string,

lv_url_end TYPE string.

SPLIT nwbc_url AT '?' INTO lv_url_star


t lv_url_end.

LOOP AT <cockpit_with_roles>-role_name
s ASSIGNING <role_name>.

2
DATA: agr_name_url TYPE string,

agr_name_url2 TYPE string.


1
DATA: agr_name_url TYPE string.

LIMU
METH
CL_NWBC_HTTP HANDLE_SAPGU
ILINK
99997

LIMU
METH
CL_NWBC_HTTP HANDLE_SAPGU
ILINK
00002

3
1
\\\\\no_empty_blocks/////
1
\\\\\comments_not_ignored/////
1
\\\\\delta_normalized/////
1
0
1
1
0
0
95
METHOD handle_sapguilink.

DATA: lv_p_transaction TYPE tcode,

lv_p_parameters TYPE string,


lv_p_destination TYPE rfcdest
,

lv_p_user TYPE string,

lt_p_parameters TYPE tihttpn


vp,

lv_p_skip_sel_screen TYPE abap_bo


ol,

lv_p_title TYPE string,

lv_p_language TYPE syst-la


ngu,

lv_p_report TYPE program


m,

lv_p_report_var TYPE raldb_v


ari,
lv_p_app_server TYPE rfcdisp
lay-rfchost,

lv_p_sys_number TYPE rfcdisp


lay-rfcservice,

lv_p_sys_id TYPE sy-sysi


d,

lv_p_client TYPE syst-ma


ndt,

lv_user LIKE sy-unam


e,

lv_xuser TYPE xstring


,

lr_conv TYPE REF TO


cl_abap_conv_in_ce,

lo_shortcut TYPE REF TO


cl_nwbc_sapgui_shortcut,

lv_shortcut TYPE string,


lv_shortcut_x TYPE xstring
,

lt_shortcut TYPE string_


table.

lv_p_transaction = mo_server_assist
->get_filtered_form_field( name = cl_nwbc_
sapgui_shortcut=>gc_s_url_param-transactio
n upper = abap_true ).

lv_p_destination = mo_server_assist
->get_filtered_form_field( name = cl_nwbc_
sapgui_shortcut=>gc_s_url_param-destinatio
n ).

lv_p_user = mo_server_assist
->get_filtered_form_field( name = cl_nwbc_
sapgui_shortcut=>gc_s_url_param-user ).

lv_p_client = mo_server_assist
->get_filtered_form_field( name = cl_nwbc_
sapgui_shortcut=>gc_s_url_param-client upp
er = abap_true default = sy-mandt ).

lv_p_title = mo_server_assist
->get_filtered_form_field( name = cl_nwbc_
sapgui_shortcut=>gc_s_url_param-title ).
lv_p_language = mo_server_assist
->get_filtered_form_field( name = cl_nwbc_
sapgui_shortcut=>gc_s_url_param-language u
pper = abap_true ).

lv_p_report = mo_server_assist
->get_filtered_form_field( name = cl_nwbc_
sapgui_shortcut=>gc_s_url_param-report upp
er = abap_true ).

lv_p_report_var = mo_server_assist
->get_filtered_form_field( name = cl_nwbc_
sapgui_shortcut=>gc_s_url_param-report_var
upper = abap_true ).

lv_p_app_server = mo_server_assist
->get_filtered_form_field( name = cl_nwbc_
sapgui_shortcut=>gc_s_url_param-app_server
).

lv_p_sys_number = mo_server_assist
->get_filtered_form_field( name = cl_nwbc_
sapgui_shortcut=>gc_s_url_param-sys_number
).

lv_p_sys_id = mo_server_assist
->get_filtered_form_field( name = cl_nwbc_
sapgui_shortcut=>gc_s_url_param-system_id
default = sy-sysid ).

lv_p_skip_sel_screen = mo_server_assist
->get_bool_form_field( name = cl_nwbc_sapg
ui_shortcut=>gc_s_url_param-skip_sel_scree
n ).

lv_p_parameters = mo_server_assist->ge
t_filtered_form_field( name = cl_nwbc_sapg
ui_shortcut=>gc_s_url_param-parameters ).
cl_nwbc_utility=>string_to_fields( EXPOR
TING iv_string = lv_p_parameters IMPORTING
et_fields = lt_p_parameters ).

lv_user = sy-uname.

IF lv_p_user IS NOT INITIAL.

" Decode User

CALL FUNCTION 'SCMS_BASE64_DECODE_STR'


EXPORTING

input = lv_p_user

IMPORTING

output = lv_xuser

EXCEPTIONS

failed = 1

OTHERS = 2.

IF sy-subrc IS INITIAL.
lr_conv = cl_abap_conv_in_ce=>create
( input = lv_xuser ).

lr_conv->read( IMPORTING data = lv_u


ser ).

ENDIF.

ENDIF.

IF lt_p_parameters IS NOT INITIAL.

lv_p_skip_sel_screen = abap_true.

ENDIF.
CREATE OBJECT lo_shortcut

EXPORTING

iv_transaction_code = lv_p_tr
ansaction

it_parameters = lt_p_pa
rameters

iv_user_id = lv_user

iv_title = lv_p_ti
tle

iv_client_id = lv_p_cl
ient
iv_language = lv_p_la
nguage

iv_report_name = lv_p_re
port

iv_report_variant = lv_p_re
port_var

iv_system_id = lv_p_sy
s_id

iv_application_server_name = lv_p_ap
p_server

iv_system_number = lv_p_sy
s_number

iv_skip_initial_screen = lv_p_sk
ip_sel_screen

iv_sm59_destination = lv_p_de
stination.
lo_shortcut->get_shortcut( IMPORTING et_
shortcut = lt_shortcut ).

CONCATENATE LINES OF lt_shortcut INTO lv


_shortcut SEPARATED BY crlf.

lv_shortcut_x = cl_abap_codepage=>conver
t_to(

source = lv_shortcut " Source


String

codepage = 'ISO-8859-1' " Code P


age Name

ignore_cerr = abap_true " Ignore


Conversion Errors
).
"#EC NOTEXT

* Render HTTP response

mo_server_assist->set_response( iv_conte
nt = lv_shortcut_x iv_content_type = if_nw
bc_constants=>gc_s_file_type-sapshortcut )
.

ENDMETHOD.

LIMU
METH
CL_NWBC_RUNTIME35 CHECK_NAVIGA
TION_TREE_CACHE
00017

LIMU
METH
CL_NWBC_RUNTIME35 CHECK_NAVIGA
TION_TREE_CACHE
00019

3
1
\\\\\no_empty_blocks/////
1
\\\\\comments_not_ignored/////
1
\\\\\delta_normalized/////
1
0
1
9
3
CHECK menu_type NE if_nwbc_constants=>gc
_s_menu_type-favorites.

lv_version = me->if_nwbc_runtime~get_run
time_version( ).

ev_is_nav_tree_cache_valid = abap_true.

2
ev_dont_cache = abap_false.

LIMU
METH
CL_NWBC_RUNTIME35 CHECK_SAP_ME
NU_CACHE
00011

LIMU
METH
CL_NWBC_RUNTIME35 CHECK_SAP_ME
NU_CACHE
00013

3
1
\\\\\no_empty_blocks/////
1
\\\\\comments_not_ignored/////
1
\\\\\delta_normalized/////
1
0
1
8
6
DATA: lt_navigation_tree TYPE IF_NWBC_RU
NTIME35=>T_navigation_tree,

ls_nwbc_nav_tree TYPE nwbc_nav_tre


e,

ls_sap_menu_info TYPE t_sap_menu_i


nfo,

ls_user_info TYPE IF_NWBC_RUNTIME3


5=>T_user_info

* Check SAP Menu


1
ls_sap_menu_info = me->get_sap_menu_info
( ).

2
ev_cache_exist = abap_false.

ls_sap_menu_info = me->get_sap_menu_info
( ).

LIMU
METH
CL_NWBC_RUNTIME35 GET_ENTERPRI
SE_SEARCH_ENTRIES
00003

LIMU
METH
CL_NWBC_RUNTIME35 GET_ENTERPRI
SE_SEARCH_ENTRIES
00005

3
1
\\\\\no_empty_blocks/////
1
\\\\\comments_not_ignored/////
1
\\\\\delta_normalized/////
1
0
3
2
1
method GET_ENTERPRISE_SEARCH_ENTRIES.
1
* IMPORTANT: This code only NW7.02+ and NW
7.20+

* IMPORTANT: This code only NW7.02+ and NW


7.20+

67
3
ENDLOOP.

CATCH cx_root INTO exception.


"#EC NO_HANDLER

ENDTRY.

1
* move "All Content" to the front

2
* move "All Content" to the front

72
3
READ TABLE rt_enterprise_search_entr
ies INTO search_entry INDEX all_content.

DELETE rt_enterprise_search_entries
INDEX all_content.

INSERT search_entry INTO rt_enterpri


se_search_entries INDEX 1.

3
endif.

ENDIF.

14
ENDIF.
" based on last request from ES colleg
es, they do nto want to see different ES c
ategories in the NWBC

" but want to have only one entry, cor


responding to ALL_CONTENT category

" but we do not know, if they will not


decide to change their mind soon, so we g
o defensive approach

" and leave the logic for category col


lection in place, but only leave one singl
e category in the list

" if exist. In most cases it will be A


LL_CONTENT category

READ TABLE rt_enterprise_search_entrie


s INDEX 1 INTO search_entry.

IF sy-subrc IS INITIAL.
CLEAR rt_enterprise_search_entries.

APPEND search_entry TO rt_enterprise


_search_entries.

ENDIF.

ENDIF.

LIMU
METH
CL_NWBC_RUNTIME35 IF_NWBC_RUNT
IME35~GET_ASSOCIATED_APPS
00004

LIMU
METH
CL_NWBC_RUNTIME35 IF_NWBC_RUNT
IME35~GET_ASSOCIATED_APPS
00006

3
1
\\\\\no_empty_blocks/////
1
\\\\\comments_not_ignored/////
1
\\\\\delta_normalized/////
1
0
1
55
6
DELETE ADJACENT DUPLICATES FROM lt_sps.

" OK, there are no duplicated SPs, but e


ven if they different, clients are not abl
e to display

" SPs with same texts, so we need to als


o delete side panels based on text equity

lt_nav_tree_srt = lt_nav_tree.

1
LOOP AT lt_nav_tree ASSIGNING <entry>.

1
LOOP AT lt_nav_tree_srt ASSIGNING <entry
>.
LIMU
METH
CL_NWBC_RUNTIME35 IF_NWBC_RUNT
IME35~GET_ASSOCIATED_LINKS
00004

LIMU
METH
CL_NWBC_RUNTIME35 IF_NWBC_RUNT
IME35~GET_ASSOCIATED_LINKS
00006

3
1
\\\\\no_empty_blocks/////
1
\\\\\comments_not_ignored/////
1
\\\\\delta_normalized/////
1
0
2
7
4
DATA: lt_nav_tree TYPE if_nwbc_run
time=>t_navigation_tree,

lt_nav_tree_srt TYPE if_nwbc_run


time=>t_navigation_tree_srt,

lt_tree_nodes TYPE if_nwbc_run


time=>t_navigation_tree,

lt_nodes LIKE et_node_ids


,

2
lt_texts TYPE string_tabl
e,

lt_links LIKE et_node_ids


,

1
lt_links LIKE et_node_ids
,

55
6
DELETE ADJACENT DUPLICATES FROM lt_links
.

" OK, there are no duplicated SPs, but e


ven if they different, clients are not abl
e to display

" SPs with same texts, so we need to als


o delete side panels based on text equity

lt_nav_tree_srt = lt_nav_tree.
1
LOOP AT lt_nav_tree ASSIGNING <entry>.

1
LOOP AT lt_nav_tree_srt ASSIGNING <entry
>.

LIMU
METH
CL_NWBC_RUNTIME35 IF_NWBC_RUNT
IME35~GET_ASSOCIATED_SEARCHES
00004

LIMU
METH
CL_NWBC_RUNTIME35 IF_NWBC_RUNT
IME35~GET_ASSOCIATED_SEARCHES
00006

3
1
\\\\\no_empty_blocks/////
1
\\\\\comments_not_ignored/////
1
\\\\\delta_normalized/////
1
0
1
62
6
DELETE ADJACENT DUPLICATES FROM lt_searc
hes.
" OK, there are no duplicated SPs, but e
ven if they different, clients are not abl
e to display

" SPs with same texts, so we need to als


o delete side panels based on text equity

lt_nav_tree_srt = lt_nav_tree.

1
LOOP AT lt_nav_tree ASSIGNING <entry>.

1
LOOP AT lt_nav_tree_srt ASSIGNING <entry
>.

LIMU
METH
CL_NWBC_RUNTIME35 IF_NWBC_RUNT
IME35~INVALIDATE_NAV_TREE_CACHE
00016

LIMU
METH
CL_NWBC_RUNTIME35 IF_NWBC_RUNT
IME35~INVALIDATE_NAV_TREE_CACHE
00018

3
1
\\\\\no_empty_blocks/////
1
\\\\\comments_not_ignored/////
1
\\\\\delta_normalized/////
1
0
2
2
1
method IF_NWBC_RUNTIME35~INVALIDATE_NAV_TR
EE_CACHE.

1
DELETE FROM DATABASE nwbc_nav_tree(nt) I
D me->cache_id."Navigation Tree Data

DATA: lv_cache_counter TYPE i,

lv_cache_counter_string TYPE strin


g.

IF iv_all_users EQ abap_true.
DELETE FROM nwbc_nav_tree.
"#EC CI_NOWHERE

IMPORT cache_counter = lv_cache_counte


r_string FROM DATABASE indx(^c) ID c_nwbc_
cache_counter_id.

ELSE.

DELETE FROM DATABASE nwbc_nav_tree(nt)


ID me->cache_id."Navigation Tree Data

7
3
DELETE FROM DATABASE nwbc_nav_tree(ob) I
D me->cache_id."OBN Data

DELETE FROM DATABASE nwbc_nav_tree(bo) I


D me->cache_id."OBN Raw data (agr_hier_bor
)

DELETE FROM DATABASE nwbc_nav_tree(sc) I


D me->cache_id."Session Cache

5
CLEAR: me->cached_navigation_tree.
CLEAR: me->cached_obn_targets.

CLEAR: me->cached_user_menu.

cl_nwbc_logger=>add_message( runtime = m
e no = 031 v1 = me->cache_id-extended_key
).

22
IMPORT cache_counter = lv_cache_counte
r_string FROM DATABASE indx(^c) ID me->cac
he_id.

ENDIF.

CLEAR: me->cached_navigation_tree.
CLEAR: me->cached_obn_targets.

CLEAR: me->cached_user_menu.

lv_cache_counter = lv_cache_counter_stri
ng.

ADD 1 TO lv_cache_counter.

lv_cache_counter_string = lv_cache_count
er.

CONDENSE lv_cache_counter_string.

" record cache invalidation, to update o


ur role keys later
IF iv_all_users EQ abap_true.

EXPORT cache_counter = lv_cache_counte


r_string TO DATABASE indx(^c) ID c_nwbc_ca
che_counter_id.

ELSE.

EXPORT cache_counter = lv_cache_counte


r_string TO DATABASE indx(^c) ID me->cache
_id.

ENDIF.

IF iv_log EQ abap_true.

cl_nwbc_logger=>add_message( runtime =
me no = 031 v1 = me->cache_id-extended_ke
y ).
ENDIF.

LIMU
METH
CL_NWBC_RUNTIME35 IF_NWBC_RUNT
IME~EPCM_DO_NAVIGATE
00038

LIMU
METH
CL_NWBC_RUNTIME35 IF_NWBC_RUNT
IME~EPCM_DO_NAVIGATE
00040

3
1
\\\\\no_empty_blocks/////
1
\\\\\comments_not_ignored/////
1
\\\\\delta_normalized/////
1
0
2
4
3
METHOD if_nwbc_runtime~epcm_do_navigate.

CONSTANTS: lc_is_suspend_scenario TYPE s


tring VALUE `sap-nwbc-is_suspend_scenario`
, "#EC NOTEXT

3
lc_force_local_system TYPE s
tring VALUE `sap-nwbc-force_local_system`,
"#EC NOTEXT

lc_crystal_report TYPE s
tring VALUE `CrystalReport`, "#EC NOTEXT

lc_hook_url TYPE s
tring VALUE `HOOK_URL`, "#EC NOTEXT

1
lc_hook_url TYPE s
tring VALUE `HOOK_URL`, "#EC NOTEXT

32
3
query TYPE string,

lv_subrc TYPE sysubrc


.

2
FIELD-SYMBOLS: <ff> LIKE LINE OF post_b
ody,

<ff2> LIKE LINE OF post_b


ody.
1
FIELD-SYMBOLS: <ff> LIKE LINE OF post_b
ody.

LIMU
METH
CL_NWBC_RUNTIME35 IF_NWBC_RUNT
IME~GET_USER_INFO
00035

LIMU
METH
CL_NWBC_RUNTIME35 IF_NWBC_RUNT
IME~GET_USER_INFO
00037

3
1
\\\\\no_empty_blocks/////
1
\\\\\comments_ignored/////
1
\\\\\delta_normalized/////
1
0
8
187
3
theme = server->request->get_form_fi
eld( if_http_form_fields_sap=>sap_theme ).

IF theme IS NOT INITIAL.

" check that theme name is valid


1
IF theme CA `#^&?%"'<>=+`. "#E
C NOTEXT

1
IF theme CA `#^&?%"'<>=+`. "#E
C STRING_OK

209
5
DATA: roles TYPE if_nwbc_runtime3
5=>t_roles,

ts LIKE me->cached_user_
info-roles_timestamp,

role_list TYPE string,

role_hash TYPE hash160.

1
FIELD-SYMBOLS: <role> LIKE LINE OF rol
es.
4
DATA: lv_global_cache_counter_string T
YPE string,

lv_my_cache_counter_string T
YPE string.

FIELD-SYMBOLS: <role> LIKE LINE OF rol


es.

214
4

" unfortunaelly we need to store sessi


on context, for which we have generated ou
r keys,

" to be able to update our cache, in c


ase of sesion context is changed (initiali
zed)

me->cached_user_info-session_context =
ls_context-default_context.
2

roles = me->if_nwbc_runtime~get_roles(
).

IMPORT cache_counter = lv_global_cache


_counter_string FROM DATABASE indx(^c) ID
c_nwbc_cache_counter_id.

IMPORT cache_counter = lv_my_cache_cou


nter_string FROM DATABASE indx(^c) ID me->
cache_id.

roles = me->if_nwbc_runtime~get_roles(
).

242
7
CONCATENATE `r-` sy-saprl
`--u-` sy-uname

`--rh- ` role_hash

`--l-` me->cached_user_
info-language

`--a-` me->cached_user_
info-accessibility

`--tn-` me->cached_user_
info-show_transaction_codes

`--cd-` cache_discrimina
tor

1
`--rtl-` me->runtime_load

3
`--gcd-` lv_global_cache_
counter_string
`--mcd-` lv_my_cache_coun
ter_string

`--rtl-` me->runtime_load

252
6
CONDENSE me->cached_user_info-roles_ke
y NO-GAPS.

"Favorites ***************************
******************************************
*****

"timestamp

DATA: lv_fav_change_date TYPE dats,

2
lv_fav_change_time TYPE tims,
lv_version TYPE string.

1
lv_fav_change_time TYPE tims.

266
3
IF sy-subrc EQ 0.

CONVERT DATE lv_fav_change_date TIME


lv_fav_change_time INTO TIME STAMP me->ca
ched_user_info-favorites_timestamp TIME ZO
NE sy-zonlo.

ENDIF.

lv_version = me->if_nwbc_runtime~get_r
untime_version( ).
"favorites key

"favorites key

276
6
CONCATENATE `r-` sy-saprl

`--u-` sy-uname

`--l-` me->cached_user_
info-language

`--a-` me->cached_user_
info-accessibility

`--tn-` me->cached_user_
info-show_transaction_codes
`--cd-` cache_discrimina
tor

1
`--rtl-` me->runtime_load

3
`--gcd-` lv_global_cache_
counter_string

`--mcd-` lv_my_cache_coun
ter_string

`--rtl-` me->runtime_load

302
6
CONCATENATE `r-` sy-saprl

`--rh- ` me->cached_user_
info-sap_menu_name

`--l-` me->cached_user_
info-language
`--a-` me->cached_user_
info-accessibility

`--tn-` me->cached_user_
info-show_transaction_codes

`--cd-` cache_discrimina
tor

1
`--rtl-` me->runtime_load

3
`--gcd-` lv_global_cache_
counter_string

`--mcd-` lv_my_cache_coun
ter_string

`--rtl-` me->runtime_load

LIMU
METH
CL_NWBC_RUNTIME35 IF_NWBC_RUNT
IME~HANDLE_API
00018

LIMU
METH
CL_NWBC_RUNTIME35 IF_NWBC_RUNT
IME~HANDLE_API
00020

3
1
\\\\\no_empty_blocks/////
1
\\\\\comments_not_ignored/////
1
\\\\\delta_normalized/////
1
0
3
147
3
ELSE.

lv_version = io_server_assist->g
et_filtered_form_field( name = 'nwbc_runti
me_version' accept = '0-9.' ). "#EC NOTEXT

lv_sb = io_server_assist->g
et_filtered_form_field( name = 'sap-nwbc-s
upportbits' accept = '0-9A-F' ). "#EC NOTE
XT

1
cl_nwbc=>initialize_client( vers
ion = lv_version support_bits = lv_sb ).

1
cl_nwbc=>initialize_client( vers
ion = lv_version support_bits = lv_sb nwbc
_shell = nwbc_shell ).
201
3

lv_version = io_server_assist->get
_filtered_form_field( name = 'nwbc_runtime
_version' accept = '0-9.' ). "#EC NOTEXT

lv_sb = io_server_assist->get
_filtered_form_field( name = 'sap-nwbc-sup
portbits' accept = '0-9A-F' ). "#EC NOTEXT

3
cl_nwbc=>initialize_client( EXPORT
ING version = lv_version support_bits = lv
_sb EXCEPTIONS already_initialized = 1 ).

CLEAR cached_user_info.

IF sy-subrc IS NOT INITIAL. ENDIF.


"#EC NEEDED

2
cl_nwbc=>initialize_client( EXPORT
ING version = lv_version support_bits = lv
_sb nwbc_shell = nwbc_shell ).

CLEAR cached_user_info.
442
5
io_server_assist->set_response(

iv_content = xml

iv_content_type = if_nwbc_consta
nts=>gc_s_file_type-xml ).

WHEN 'INVALIDATE_NAVIGATION_TREE_BUF
FER' OR 'INVALIDATENAVIGATIONTREEBUFFER'.

1
if_nwbc_runtime35~invalidate_nav_t
ree_cache( ).

1
if_nwbc_runtime35~invalidate_nav_t
ree_cache( iv_log = abap_false ).

LIMU
METH
CL_NWBC_RUNTIME35 IF_NWBC_RUNT
IME~RESOLVE_NAVIGATION
00026
LIMU
METH
CL_NWBC_RUNTIME35 IF_NWBC_RUNT
IME~RESOLVE_NAVIGATION
00028

3
1
\\\\\no_empty_blocks/////
1
\\\\\comments_not_ignored/////
1
\\\\\delta_normalized/////
1
0
1
395
3
DATA: ls_navigation_entry LIKE navigat
ion_entry.

ls_navigation_entry = navigation_entry
.

ls_navigation_entry-target_system = sm
59_alias.

1
cl_nwbc=>read_query_parameter( EXPORTI
NG iv_name = 'orig_url' CHANGING cv_url =
url rv_value = ls_navigation_entry-url ).

1
cl_nwbc=>read_query_parameter( EXPORTI
NG iv_name = 'orig_url' CHANGING cv_url =
url rv_value = ls_navigation_entry-url ).
"#EC NOTEXT

LIMU
METH
CL_NWBC_RUNTIME35 RESOLVE_LPD_
CRE
00002

LIMU
METH
CL_NWBC_RUNTIME35 RESOLVE_LPD_
CRE
00004

3
1
\\\\\no_empty_blocks/////
1
\\\\\comments_not_ignored/////
1
\\\\\delta_normalized/////
1
0
2
3
2
METHOD resolve_lpd_cre.

2
CONSTANTS: lc_force_local_system TYPE
string VALUE `sap-nwbc-force_local_system
`,

lc_crystal_report TYPE
string VALUE `CrystalReport`.

2
CONSTANTS: lc_force_local_system TYPE
string VALUE `sap-nwbc-force_local_system
`, "#EC NOTEXT
lc_crystal_report TYPE
string VALUE `CrystalReport`. "#EC NOTEXT

76
3
ENDIF.

" Crystal Reports do now like sap-clie


nt they WANT sap_client! CSN 2334674 2011

1
REPLACE ALL OCCURRENCES OF if_http_for
m_fields_sap=>sap_client IN ev_url WITH `s
ap_client`.

1
REPLACE ALL OCCURRENCES OF if_http_for
m_fields_sap=>sap_client IN ev_url WITH `s
ap_client`. "#EC NOTEXT

LIMU
METH
CL_NWBC_RUNTIME35 RESOLVE_URL

00024

LIMU
METH
CL_NWBC_RUNTIME35 RESOLVE_URL

00026

3
1
\\\\\no_empty_blocks/////
1
\\\\\comments_not_ignored/////
1
\\\\\delta_normalized/////
1
0
5
13
6
DATA: lv_length TYPE i,

lv_query TYPE string,

lv_params TYPE string,

lv_obn_system TYPE string,

lv_obn_object TYPE string,

lv_obn_operation TYPE string,


1
lt_fields LIKE query_parms
,

2
lo_lsapi TYPE REF TO if_l
sapi,

lt_fields LIKE query_parms


,

18
4
in_parms LIKE query_parms
.

FIELD-SYMBOLS: <ff> LIKE LINE OF query


_parms.

1
IF target CS `OBN://` AND sy-fdpos EQ 0.
3
lo_lsapi = cl_lsapi_manager=>get_instanc
e( ).

IF target CS `OBN://` AND sy-fdpos EQ 0.

155
4
ELSEIF target CS if_lsapi=>gc_s_protocol
-transaction AND sy-fdpos EQ 0.

* Example

* ls-tr://YI3100~SE80?USR02-BNAME=XYZ

3
DATA: lv_sm59_alias TYPE string,
lv_dynp_okcode TYPE string,

lv_transaction TYPE string.

5
DATA: lv_sm59_alias TYPE rfcdest,

lv_dynp_okcode TYPE string,

lv_native_sapgui TYPE abap_bool


,

lv_force_sapgui TYPE string,

lv_transaction TYPE tcode.

172
3
IF lv_transaction IS INITIAL.
RAISE not_resolved.

ENDIF.

report_type = if_nwbc_runtime~e_report
_type-transaction.

13

lv_native_sapgui = lo_lsapi->is_suppor
ted( feature = if_lsapi=>mc_feature_nwbc_n
ative_sapgui ).

cl_nwbc=>read_query_parameter( EXPORTI
NG iv_name = if_lsapi=>mc_tr_force_sapgui
iv_delete = abap_true

CHANGIN
G cv_get = lv_params ct_post = query_par
ms rv_value = lv_force_sapgui ).

IF lv_force_sapgui EQ abap_true AND lv


_native_sapgui EQ abap_false.

report_type = if_nwbc_runtime~e_repo
rt_type-url.

cl_nwbc_utility=>string_to_fields( E
XPORTING iv_string = lv_params IMPORTING e
t_fields = lt_fields ).

APPEND LINES OF query_parms TO lt_fi


elds.

url = cl_nwbc_sapgui_shortcut=>url(
iv_transaction_code = lv_transaction iv_sm
59_destination = lv_sm59_alias it_paramete
rs = lt_fields ).

ELSE.
report_type = if_nwbc_runtime~e_repo
rt_type-transaction.

179
4
cl_nwbc=>read_query_parameter( EXPORTI
NG iv_name = cl_url=>mc_its_dynp_okcode iv
_delete = abap_true

CHANGIN
G cv_get = lv_params ct_post = query_par
ms rv_value = lv_dynp_okcode ).

url = me->url->its( sm59_alias = lv_sm


59_alias transaction = lv_transaction dynp
_okcode = lv_dynp_okcode query_parms = que
ry_parms query_string = lv_params ).

3
CLEAR query_parms. " no post body for
transactions

ELSEIF target CS `mailto:` AND sy-fdpos


EQ 0.
4
ENDIF.

CLEAR query_parms. " no post body for


transactions

ELSEIF target CS `mailto:` AND sy-fdpos


EQ 0. "#EC NOTEXT

LIMU
METH
CL_NWBC_RUNTIME35 TREE_PROCESS
_APPL_ALIAS_GLOBAL
00017

LIMU
METH
CL_NWBC_RUNTIME35 TREE_PROCESS
_APPL_ALIAS_GLOBAL
00019

3
1
\\\\\no_empty_blocks/////
1
\\\\\comments_not_ignored/////
1
\\\\\delta_normalized/////
1
0
1
15
3
DATA: lv_name TYPE str
ing,
lv_clone_id TYPE s
tring,

lv_object_id TYPE s
tring,

2
lt_result_tab TYPE mat
ch_result_tab,

lt_transactions_refs TYPE tt_


references,

1
lt_transactions_refs TYPE tt_
references,

LIMU
METH
CL_NWBC_SAPGUI_SHORTCUT ADD_HEADER

99997

LIMU
METH
CL_NWBC_SAPGUI_SHORTCUT ADD_HEADER

00002

3
1
\\\\\no_empty_blocks/////
1
\\\\\comments_not_ignored/////
1
\\\\\delta_normalized/////
1
0
1
1
0
0
7
METHOD add_header.

FIELD-SYMBOLS: <line> LIKE LINE OF data.

IF header IS NOT INITIAL.

APPEND INITIAL LINE TO data ASSIGNING


<line>.

CONCATENATE `[` header `]` INTO <line>


.

ENDIF.

ENDMETHOD.
LIMU
METH
CL_NWBC_SAPGUI_SHORTCUT ADD_OPTION

99997

LIMU
METH
CL_NWBC_SAPGUI_SHORTCUT ADD_OPTION

00002

3
1
\\\\\no_empty_blocks/////
1
\\\\\comments_not_ignored/////
1
\\\\\delta_normalized/////
1
0
1
1
0
0
7
METHOD add_option.

FIELD-SYMBOLS: <line> LIKE LINE OF data.

IF name IS NOT INITIAL AND value IS NOT


INITIAL.

APPEND INITIAL LINE TO data ASSIGNING


<line>.

CONCATENATE name `=` value INTO <line>


.
ENDIF.

ENDMETHOD.

LIMU
METH
CL_NWBC_SAPGUI_SHORTCUT ADD_URL_PARA
M
99997

LIMU
METH
CL_NWBC_SAPGUI_SHORTCUT ADD_URL_PARA
M
00002

3
1
\\\\\no_empty_blocks/////
1
\\\\\comments_not_ignored/////
1
\\\\\delta_normalized/////
1
0
1
1
0
0
11
METHOD add_url_param.
FIELD-SYMBOLS: <ff> LIKE LINE OF fields.

IF name IS NOT INITIAL AND value NE defa


ult.

APPEND INITIAL LINE TO fields ASSIGNIN


G <ff>.

<ff>-name = name.

<ff>-value = value.

ENDIF.

ENDMETHOD.
LIMU
METH
CL_NWBC_SAPGUI_SHORTCUT CONSTRUCTOR

99997

LIMU
METH
CL_NWBC_SAPGUI_SHORTCUT CONSTRUCTOR

00002

3
1
\\\\\no_empty_blocks/////
1
\\\\\comments_not_ignored/////
1
\\\\\delta_normalized/////
1
0
1
1
0
0
204
METHOD constructor.

" SYSTEM

mv_system_id = iv_system
_id.
mv_client_id = iv_client
_id.

mv_system_description = iv_system
_description.

mv_application_server_name = iv_applic
ation_server_name.

mv_system_number = iv_system
_number.

mt_gateway_hosts = it_gatewa
y_hosts.

mv_message_server_name = iv_messag
e_server_name.

mv_service_port = iv_servic
e_port.

mv_logon_group = iv_logon_
group.
" USER

mv_user_id = iv_user_i
d.

mv_password = iv_passwo
rd.

mv_language = iv_langua
ge.

" FUNCTION

mv_system_command = iv_system
_command.

mv_report_name = iv_report
_name.
mv_report_variant = iv_report
_variant.

mv_transaction_code = iv_transa
ction_code.

mv_skip_initial_screen = iv_skip_i
nitial_screen.

mt_parameters = it_parame
ters.

mv_title = iv_title.

" OPTIONS

mv_trace_level = iv_trace_
level.

mv_work_directory = iv_work_d
irectory.

mv_gui_size = iv_gui_si
ze.

mv_reuse_existing_connection = iv_reuse_
existing_connection.

" now complete defaults

DATA: lv_usr_snc TYPE snc_pname,

lv_sys_snc TYPE pname_appl,

lv_sys_snc_qop TYPE snc_qop VALUE


'9',

ls_bapi_snc TYPE bapisncu,


lt_bapiret TYPE bapirettab,

lv_rfc_dest LIKE iv_sm59_destin


ation.

lv_rfc_dest = iv_sm59_destination.

" if nothing is provided, assume local s


ystem

IF lv_rfc_dest IS INITIAL AND iv_applica


tion_server_name IS INITIAL AND

iv_message_server_name IS INITIAL AND


iv_logon_group IS INITIAL.

lv_rfc_dest = sc_local_system.
ENDIF.

IF lv_rfc_dest EQ sc_local_system.

CALL FUNCTION 'CREATE_RFC_REENTRANCE_T


ICKET'

IMPORTING

ticket = mv_sso_co
okie

EXCEPTIONS
ticket_logon_disabled = 1

ticket_creation_failed = 2

OTHERS = 4.

IF sy-subrc IS NOT INITIAL OR mv_sso_c


ookie IS INITIAL.

CALL FUNCTION 'SNC_GET_MY_INFO'


"#EC *

IMPORTING

pname_appl = lv_sys_snc
snc_qop_max = lv_sys_snc_qop

pname_user = lv_usr_snc

EXCEPTIONS

internal_error = 1

snc_not_active = 2

OTHERS = 3.

IF lv_usr_snc IS INITIAL AND sy-subr


c NE 2.
CALL FUNCTION 'BAPI_USER_GET_DETAI
L'

EXPORTING

username = iv_user_id

IMPORTING

snc = ls_bapi_snc

TABLES

return = lt_bapiret.
lv_usr_snc = ls_bapi_snc-pname.

ENDIF.

ENDIF.

DATA: lv_system_text TYPE tmsmconf-sy


stxt,

lv_system_host TYPE tmscdes-rfc


host.
CALL FUNCTION 'TMS_CFG_GET_LOCAL_SYSTE
M_INFO'

IMPORTING

ev_system_text = lv_system_text

ev_system_host = lv_system_host

EXCEPTIONS

OTHERS.

IF sy-subrc IS INITIAL.
mv_system_description = lv_sys
tem_text.

mv_application_server_name = lv_sys
tem_host.

mv_system_number = get_sy
stem_number( lv_system_host(32) ).

ENDIF.

ELSEIF lv_rfc_dest IS NOT INITIAL.

DATA: dest TYPE cl_url=>t_single_sm59_


destination.
cl_url=>resolve_sm59_alias( EXPORTING
alias = lv_rfc_dest IMPORTING sm59_rfc_des
tination = dest ).

IF dest-name IS NOT INITIAL AND dest-r


c IS INITIAL.

lv_rfc_dest = dest-name.

ENDIF.

CALL FUNCTION 'SNC_GET_MY_INFO' DESTIN


ATION lv_rfc_dest "#EC *

IMPORTING

pname_appl = lv_sys_snc
snc_qop_max = lv_sys_snc_qop

pname_user = lv_usr_snc

EXCEPTIONS

internal_error = 1

snc_not_active = 2

OTHERS = 3.

IF lv_usr_snc IS INITIAL AND sy-subrc


NE 2.
CALL FUNCTION 'BAPI_USER_GET_DETAIL'
DESTINATION lv_rfc_dest

EXPORTING

username = iv_user_id

IMPORTING

snc = ls_bapi_snc

TABLES

return = lt_bapiret

EXCEPTIONS
OTHERS.

IF sy-subrc IS INITIAL.

lv_usr_snc = ls_bapi_snc-pname.

ENDIF.

ENDIF.

DATA: lv_loadbalancing TYPE rfcdisp


laz-rfclbflag.
DATA: lv_group TYPE rfcdisp
laz-rfcload.

DATA: lv_client TYPE rfcdisp


lay-rfcclient.

DATA: ls_rfc_system_info TYPE rfcsi.

CALL FUNCTION 'RFC_READ_R3_DESTINATION


'

EXPORTING

destination = lv_rfc_dest

authority_check = ''

bypass_buf = ''
IMPORTING

loadbalancing = lv_loadbalancing

systemid = mv_system_id

systemnr = mv_system_number

server = mv_application_s
erver_name

group = lv_group

client = lv_client

EXCEPTIONS
OTHERS.

IF sy-subrc IS INITIAL.

IF mv_system_id IS INITIAL.

DATA: lv_rfc_dest_s TYPE string.

CONSTANTS: lc_dummy_systemid TYPE


syst-sysid VALUE 'ZZZ'.
lv_rfc_dest_s = lv_rfc_dest.

CALL FUNCTION 'RFC_GET_SYSTEM_INFO


'

EXPORTING

destination = lv_r
fc_dest_s

IMPORTING

rfcsi_export = ls_r
fc_system_info

EXCEPTIONS

authority_not_available = 1
OTHERS = 2.

IF sy-subrc IS INITIAL AND ls_rfc_


system_info-rfcsysid IS NOT INITIAL.

mv_system_id = ls_rfc_system_inf
o-rfcsysid.

ELSE.

mv_system_id = lc_dummy_systemid
.

ENDIF.

ENDIF.
IF lv_client IS NOT INITIAL.

mv_client_id = lv_client.

ENDIF.

IF lv_group IS NOT INITIAL.

mv_logon_group = lv_group.

CONCATENATE '[' mv_logon_group ']'


INTO mv_system_description.

CONCATENATE mv_system_id mv_system


_description INTO mv_system_description SE
PARATED BY space.
ENDIF.

ENDIF.

ENDIF.

IF lv_usr_snc IS NOT INITIAL.

mv_snc_partner_name = lv_sys_snc.

mv_snc_quality_of_protection = lv_sys_
snc_qop.
ENDIF.

ENDMETHOD.

LIMU
METH
CL_NWBC_SAPGUI_SHORTCUT CREATE_TRANS
ACTION_STRING
99997

LIMU
METH
CL_NWBC_SAPGUI_SHORTCUT CREATE_TRANS
ACTION_STRING
00002

3
1
\\\\\no_empty_blocks/////
1
\\\\\comments_not_ignored/////
1
\\\\\delta_normalized/////
1
0
1
1
0
0
51
METHOD create_transaction_string.
DATA: len TYPE i,

lv_name TYPE string,

tr_parms TYPE string.

FIELD-SYMBOLS: <ff> LIKE LINE OF paramet


ers.

" it is not yet clear what control if fi


rst screen should be skept but probably th
is is like this:

" - for SLECTION SCREENs


" You need to add * symbol before tran
saction name (we do it always, if paramate
rs are passed)

" Examples (test in SAP GUI OKCODE fie


ld):

" /n*se16 DATABROWSE-TABLENAME=NWBC_


VC_GUI_TAG - skips selection screen

" /nse16 DATABROWSE-TABLENAME=NWBC_V


C_GUI_TAG - no skipping without * only
filling in of value into selection screen

" - for non SELECTION SCREEN (standard d


ynpro)

" use DYNP_OKCODE parameter instead wi


th corresponding OK code. Most likely DYNP
_OKCODE does work with selection screens a
lso.

" For more details ask Dynpro experts fr


om BC-ABA-SC
CHECK transaction_code IS NOT INITIAL.

rv = transaction_code.

LOOP AT parameters ASSIGNING <ff>.

len = strlen( <ff>-name ).

" try to collect transaction paramater


s to transaction field

CHECK len < 1 OR <ff>-name(1) NE `~`.


" skip ~nosplash, ~transaction etc paramet
ers
CHECK len < 4 OR <ff>-name(4) NS `sap-
`. " skip SAP technical parameters

lv_name = <ff>-name.

TRANSLATE lv_name TO UPPER CASE.

CONCATENATE tr_parms `;` lv_name `=` <


ff>-value INTO tr_parms. "#EC NOTEXT

ENDLOOP.

IF tr_parms IS NOT INITIAL.

" add "skip selection screen" flag for


web gui (make sence only if paramaters ar
e passed)

IF rv CN cl_url=>mc_par_its_skip_sel_s
creen AND skip_selection EQ abap_true.

CONCATENATE cl_url=>mc_par_its_skip_
sel_screen rv INTO rv.

ENDIF.

" add paramaters for transaction

IF rv CA ` `. " already parameters exi


st

CONCATENATE rv tr_parms INTO rv.


"~transaction=*XXX%20abc=123;klm=456

ELSE. " no parameters yet


CONCATENATE rv ` ` tr_parms+1 INTO r
v.

ENDIF.

ENDIF.

CONDENSE rv.

ENDMETHOD.

LIMU
METH
CL_NWBC_SAPGUI_SHORTCUT GET_COMMAND_
STRING
99997

LIMU
METH
CL_NWBC_SAPGUI_SHORTCUT GET_COMMAND_
STRING
00002

3
1
\\\\\no_empty_blocks/////
1
\\\\\comments_not_ignored/////
1
\\\\\delta_normalized/////
1
0
1
1
0
0
19
METHOD get_command_string.

* Create Command string

DATA: lv_command_part LIKE rv_command.

IF mv_transaction_code IS NOT INITIAL. "


Transaction
rv_command = create_transaction_string
( transaction_code = mv_transaction_code p
arameters = mt_parameters skip_selection =
mv_skip_initial_screen ).

ELSEIF mv_report_name IS NOT INITIAL. "


Report

IF mv_report_variant IS NOT INITIAL.

CONCATENATE mv_report_name space mv_


report_variant INTO lv_command_part RESPEC
TING BLANKS.

rv_command = surround( text = lv_com


mand_part ).

ELSE.

rv_command = surround( mv_report_nam


e ).

ENDIF.

ELSEIF mv_system_command IS NOT INITIAL.


" System Command

rv_command = surround( mv_system_comma


nd ).

ENDIF.

ENDMETHOD.

LIMU
METH
CL_NWBC_SAPGUI_SHORTCUT GET_COMMAND_
TYPE_STRING
99997

LIMU
METH
CL_NWBC_SAPGUI_SHORTCUT GET_COMMAND_
TYPE_STRING
00002

3
1
\\\\\no_empty_blocks/////
1
\\\\\comments_not_ignored/////
1
\\\\\delta_normalized/////
1
0
1
1
0
0
11
METHOD get_command_type_string.

IF mv_transaction_code IS NOT INITIAL.

rv_command_type = sc_command_type_tran
saction.

ELSEIF mv_report_name IS NOT INITIAL.

rv_command_type = sc_command_type_repo
rt.

ELSEIF mv_system_command IS NOT INITIAL.

rv_command_type = sc_command_type_syst
em_command.
ENDIF.

ENDMETHOD.

LIMU
METH
CL_NWBC_SAPGUI_SHORTCUT GET_GUI_PARA
M_STRING
99997

LIMU
METH
CL_NWBC_SAPGUI_SHORTCUT GET_GUI_PARA
M_STRING
00002

3
1
\\\\\no_empty_blocks/////
1
\\\\\comments_not_ignored/////
1
\\\\\delta_normalized/////
1
0
1
1
0
0
53
METHOD get_gui_param_string.
* Create GuiParm string

DATA: lv_service_port TYPE char20,

lv_snc_string TYPE string,

lv_snc_string2 TYPE string.

FIELD-SYMBOLS: <ls_gateway_host> LIKE LI


NE OF mt_gateway_hosts.

* append routers
LOOP AT mt_gateway_hosts ASSIGNING <ls_g
ateway_host>.

CONCATENATE rv_parameters `/H/` <ls_ga


teway_host>-router `/S/` <ls_gateway_host>
-routerservice INTO rv_parameters.

ENDLOOP.

IF mv_application_server_name IS NOT INI


TIAL.

* Set System by Application Server and


System Number

IF rv_parameters IS INITIAL.

CONCATENATE mv_application_server_na
me mv_system_number INTO rv_parameters SEP
ARATED BY space.

ELSE.
CONCATENATE rv_parameters mv_applica
tion_server_name mv_system_number INTO rv_
parameters SEPARATED BY space.

ENDIF.

ENDIF.

IF mv_system_id IS NOT INITIAL AND mv_ap


plication_server_name IS INITIAL.

CONCATENATE rv_parameters `/R/` mv_sys


tem_id INTO rv_parameters.

ENDIF.
IF mv_message_server_name IS NOT INITIAL
.

CONCATENATE rv_parameters `/M/` mv_mes


sage_server_name INTO rv_parameters.

ENDIF.

IF mv_service_port IS NOT INITIAL.

lv_service_port = mv_service_port.

CONCATENATE rv_parameters `/S/` lv_ser


vice_port INTO rv_parameters.

ENDIF.
IF mv_logon_group IS NOT INITIAL.

CONCATENATE rv_parameters `/G/` mv_log


on_group INTO rv_parameters.

ENDIF.

IF mv_snc_partner_name IS NOT INITIAL.

CONCATENATE `SNC_PARTNERNAME=` sc_quot


ation mv_snc_partner_name sc_quotation INT
O lv_snc_string.

CONCATENATE `SNC_QOP=` mv_snc_quality_


of_protection INTO lv_snc_string2.

CONCATENATE rv_parameters lv_snc_strin


g lv_snc_string2 INTO rv_parameters SEPARA
TED BY space.

* SNC_PARTNERNAME="p:CN=QPT, O=SAP-AG
, C=DE" SNC_QOP=3

ENDIF.

rv_parameters = surround( text = rv_para


meters ).

ENDMETHOD.
LIMU
METH
CL_NWBC_SAPGUI_SHORTCUT GET_SHORTCUT

99997

LIMU
METH
CL_NWBC_SAPGUI_SHORTCUT GET_SHORTCUT

00002

3
1
\\\\\no_empty_blocks/////
1
\\\\\comments_not_ignored/////
1
\\\\\delta_normalized/////
1
0
1
1
0
0
88
METHOD get_shortcut.

DATA: lv_value TYPE string.


* SYSTEM

add_header( EXPORTING header = sc_header


_system CHANGING data = et_shortcut ).

add_option( EXPORTING name = `name` valu


e = mv_system_id CHANGING data = et_short
cut ). "#EC NOTEXT

add_option( EXPORTING name = `client` va


lue = mv_client_id CHANGING data = et_sho
rtcut ). "#EC NOTEXT

IF mv_system_description IS NOT INITIAL.

CONCATENATE sc_apostrophe mv_system_de


scription sc_apostrophe INTO lv_value.

add_option( EXPORTING name = `descript


ion` value = lv_value CHANGING data = et_
shortcut ). "#EC NOTEXT

ENDIF.
DATA: lv_gui_parameters TYPE string.

lv_gui_parameters = get_gui_param_string
( ).

add_option( EXPORTING name = `guiparm` v


alue = lv_gui_parameters CHANGING data =
et_shortcut ). "#EC NOTEXT

******************************************
******************************

* USER
add_header( EXPORTING header = sc_header
_user CHANGING data = et_shortcut ).

IF mv_sso_cookie IS NOT INITIAL.

CONCATENATE '"MYSAPSSO2=' mv_sso_cooki


e '"' INTO lv_value. "#EC NOTEXT

add_option( EXPORTING name = `at` valu


e = lv_value CHANGING data = et_shortcut
). "#EC NOTEXT

ENDIF.

add_option( EXPORTING name = `name`


value = mv_user_id CHANGING data = et_sho
rtcut ). "#EC NOTEXT
add_option( EXPORTING name = `password`
value = mv_password CHANGING data = et_sho
rtcut ). "#EC NOTEXT

add_option( EXPORTING name = `language`


value = mv_language CHANGING data = et_sho
rtcut ). "#EC NOTEXT

******************************************
******************************

* FUNCTION

add_header( EXPORTING header = sc_header


_function CHANGING data = et_shortcut ).

DATA: lv_command TYPE string,


lv_command_type TYPE string.

lv_command = get_command_string( ).

lv_command_type = get_command_type_strin
g( ).

add_option( EXPORTING name = `type` v


alue = lv_command_type CHANGING data = et
_shortcut ). "#EC NOTEXT

add_option( EXPORTING name = `command` v


alue = lv_command CHANGING data = et
_shortcut ). "#EC NOTEXT

add_option( EXPORTING name = `title` v


alue = mv_title CHANGING data = et
_shortcut ). "#EC NOTEXT
******************************************
******************************

* OPTIONS

add_header( EXPORTING header = sc_header


_options CHANGING data = et_shortcut ).

IF mv_reuse_existing_connection EQ abap_
true.

add_option( EXPORTING name = `reuse`


value = `1` CHANGING data = et_shortcut ).
"#EC NOTEXT

ELSE.
add_option( EXPORTING name = `reuse`
value = `0` CHANGING data = et_shortcut ).
"#EC NOTEXT

ENDIF.

******************************************
******************************

* CONFIGURATION

add_header( EXPORTING header = sc_header


_configuration CHANGING data = et_shortcut
).
add_option( EXPORTING name = `guisize`
value = mv_gui_size CHANGING data =
et_shortcut ). "#EC NOTEXT

add_option( EXPORTING name = `workdir`


value = mv_work_directory CHANGING data =
et_shortcut ). "#EC NOTEXT

add_option( EXPORTING name = `trace`


value = mv_trace_level CHANGING data =
et_shortcut ). "#EC NOTEXT

******************************************
******************************

** SNC

* lv_value = sc_header_snc.

* APPEND lv_value TO et_shortcut.


* IF mv_snc_partner_name IS NOT INITIAL.

* CONCATENATE 'name='

* sc_apostrophe

* mv_snc_partner_name

* sc_apostrophe INTO lv_val


ue.

* APPEND lv_value TO et_shortcut.

* IF mv_snc_quality_of_protection IS NO
T INITIAL.

* CONCATENATE 'qop=' mv_snc_quality_o


f_protection INTO lv_value.

* APPEND lv_value TO et_shortcut.


* ENDIF.

* ENDIF.

******************************************
******************************

ENDMETHOD.

LIMU
METH
CL_NWBC_SAPGUI_SHORTCUT GET_SYSTEM_N
UMBER
99997

LIMU
METH
CL_NWBC_SAPGUI_SHORTCUT GET_SYSTEM_N
UMBER
00002

3
1
\\\\\no_empty_blocks/////
1
\\\\\comments_not_ignored/////
1
\\\\\delta_normalized/////
1
0
1
1
0
0
16
METHOD get_system_number.

IF iv_host IS NOT INITIAL.

SELECT SINGLE instno


"#EC *

FROM sapwlserv

INTO rv_system_number
WHERE host = iv_host.

ENDIF.

IF rv_system_number IS INITIAL.

DATA: sysno(2).

CALL 'C_GET_SYSTEM_NUMBER' ID 'SYSTEM'


FIELD sysno. "#EC CI_CCALL

rv_system_number = sysno.

ENDIF.
ENDMETHOD.

LIMU
METH
CL_NWBC_SAPGUI_SHORTCUT SURROUND

99997

LIMU
METH
CL_NWBC_SAPGUI_SHORTCUT SURROUND

00002

3
1
\\\\\no_empty_blocks/////
1
\\\\\comments_not_ignored/////
1
\\\\\delta_normalized/////
1
0
1
1
0
0
13
METHOD surround.

IF symbol IS INITIAL.
rv = text.

ELSEIF text IS NOT INITIAL.

IF blanks EQ abap_true.

CONCATENATE symbol text symbol INTO


rv RESPECTING BLANKS.

ELSE.

CONCATENATE symbol text symbol INTO


rv.

ENDIF.

ENDIF.
ENDMETHOD.

LIMU
METH
CL_NWBC_SAPGUI_SHORTCUT URL

99997

LIMU
METH
CL_NWBC_SAPGUI_SHORTCUT URL

00002

3
1
\\\\\no_empty_blocks/////
1
\\\\\comments_not_ignored/////
1
\\\\\delta_normalized/////
1
0
1
1
0
0
59
METHOD url.

DATA: lv_query TYPE string,


lv_user TYPE string,

lv_xuser TYPE xstring,

lv_parameters TYPE string,

lt_fields TYPE tihttpnvp.

" create base url

rv_url = cl_nwbc=>url_base( server = iv_


server cockpit = if_nwbc_runtime=>cockpit_
sapguilink ).

" extract existing parameters


SPLIT rv_url AT `?` INTO rv_url lv_query
.

cl_nwbc_utility=>string_to_fields( EXPOR
TING iv_string = lv_query IMPORTING et_fie
lds = lt_fields ).

" add service related parameters

add_url_param( EXPORTING name = gc_s_url


_param-transaction value = iv_transaction_
code CHANGING fields = lt_fields ).

add_url_param( EXPORTING name = gc_s_url


_param-destination value = iv_sm59_destina
tion CHANGING fields = lt_fields ).

add_url_param( EXPORTING name = gc_s_url


_param-skip_sel_screen value = iv_skip_ini
tial_screen CHANGING fields = lt_fields ).
" encode user name

lv_user = iv_user_id.

CALL FUNCTION 'SCMS_STRING_TO_XSTRING'

EXPORTING

text = lv_user

IMPORTING

buffer = lv_xuser

EXCEPTIONS

OTHERS.
IF sy-subrc IS INITIAL.

CALL FUNCTION 'SCMS_BASE64_ENCODE_STR'

EXPORTING

input = lv_xuser

IMPORTING

output = lv_user

EXCEPTIONS
OTHERS.

IF sy-subrc IS INITIAL.

add_url_param( EXPORTING name = gc_s


_url_param-user value = lv_user CHANGING f
ields = lt_fields ).

ENDIF.

ENDIF.

" pack transaction parameters

lv_parameters = cl_nwbc_utility=>fields_
to_string( it_fields = it_parameters ).

add_url_param( EXPORTING name = gc_s_url


_param-parameters value = lv_parameters CH
ANGING fields = lt_fields ).
" strip host part, if not needed

IF iv_server_relative_url EQ abap_true A
ND rv_url IS NOT INITIAL AND rv_url(1) NE
`/`.

REPLACE FIRST OCCURRENCE OF REGEX `htt


ps?://[A-Za-z0-9]+(?:-[A-Za-z0-9]+)*(?:\.[
A-Za-z0-9]+(?:-[A-Za-z0-9]+)*)*:\d{2,6}`

IN rv_url WITH ``.


"#EC NOTEXT

ENDIF.

lv_parameters = cl_nwbc_utility=>fields_
to_string( it_fields = lt_fields ).

IF lv_parameters IS NOT INITIAL.


CONCATENATE rv_url `?` lv_parameters I
NTO rv_url.

ENDIF.

ENDMETHOD.

LIMU
METH
CL_URL GET_TRANSACT
ION_NAME
00006

LIMU
METH
CL_URL GET_TRANSACT
ION_NAME
00008

3
1
\\\\\no_empty_blocks/////
1
\\\\\comments_not_ignored/////
1
\\\\\delta_normalized/////
1
0
1
9
6
DATA: path TYPE string,

query TYPE string,

parms TYPE tihttpnvp.

FIELD-SYMBOLS: <ff> LIKE LINE OF parms.

1
CHECK iv_url CS mc_path_its. " be sure t
hat we have ITS URL

3
CLEAR: ev_name, ev_skip_sel_screen, et_p
arameters.
CHECK iv_url CS mc_path_its. " be sure t
hat we have ITS URL

LIMU
REPS
NWBC_DELETE_MENU_CACHE

00011

LIMU
REPS
NWBC_DELETE_MENU_CACHE

00013

36
1
\\\\\no_empty_blocks/////
1
\\\\\comments_not_ignored/////
1
\\\\\delta_normalized/////
3
\\\\\allowed/////
FORM
*
3
\\\\\allowed/////
FUNCTION
*
3
\\\\\allowed/////
MODULE
**
3
\\\\\allowed/////
REPORT
*
3
\\\\\allowed/////
PROGRAM
*
3
\\\\\allowed/////
FUNCTION-POOL
*
4
\\\\\allowed/////
CLASS
*
DEFINITION
4
\\\\\allowed/////
CLASS
*
IMPLEMENTATION
5
\\\\\forbidden/////
CLASS
*
DEFINITION
DEFERRED
5
\\\\\forbidden/////
CLASS
*
DEFINITION
LOAD
6
\\\\\forbidden/////
CLASS
*
DEFINITION
LOCAL
FRIENDS
3
\\\\\allowed/////
AT
LINE-SELECTION
3
\\\\\allowed/////
AT
USER-COMMAND
4
\\\\\allowed/////
AT
SELECTION-SCREEN
**
3
\\\\\allowed/////
AT
PF*
2
\\\\\allowed/////
INITIALIZATION
2
\\\\\allowed/////
START-OF-SELECTION
2
\\\\\allowed/////
END-OF-SELECTION
3
\\\\\allowed/////
TOP-OF-PAGE
**
2
\\\\\allowed/////
END-OF-PAGE
3
\\\\\allowed/////
GET
**
3
\\\\\forbidden/////
GET
BADI
3
\\\\\forbidden/////
GET
BIT
3
\\\\\forbidden/////
GET
CONNECTION
3
\\\\\forbidden/////
GET
CURSOR
3
\\\\\forbidden/////
GET
DATASET
3
\\\\\forbidden/////
GET
LOCALE
3
\\\\\forbidden/////
GET
PARAMETER
3
\\\\\forbidden/////
GET
PF-STATUS
3
\\\\\forbidden/////
GET
PROPERTY
3
\\\\\forbidden/////
GET
REFERENCE
3
\\\\\forbidden/////
GET
RUN
3
\\\\\forbidden/////
GET
TIME
1
2
REPORT
NWBC_DELETE_NAV_TREE_CACHE
1
3
2
report nwbc_delete_nav_tree_cache.

14
data: lv_cache_counter type i,

lv_cache_counter_string type string.

constants lc_id type indx_srtfd value `nwb


c_cache_counter`.

"Dynamic Call because of decoupling 3.0 ru


ntime and 3.5 runtime

delete from ('NWBC_NAV_TREE').


"#EC CI_NOWHERE
import cache_counter = lv_cache_counter_st
ring from database indx(^c) id lc_id.

lv_cache_counter = lv_cache_counter_string
.

add 1 to lv_cache_counter.

lv_cache_counter_string = lv_cache_counter
.

condense lv_cache_counter_string.

export cache_counter = lv_cache_counter_st


ring to database indx(^c) id lc_id.

9
DATA: lo_runtime TYPE REF TO if_nwbc_run
time,
lo_runtime35 TYPE REF TO if_nwbc_run
time35.

lo_runtime = cl_nwbc_factory=>get_nwbc_run
time( ).

lo_runtime35 ?= lo_runtime.

CHECK lo_runtime35 IS BOUND.

lo_runtime35->invalidate_nav_tree_cache( i
v_all_users = abap_true iv_log = abap_fals
e ).

LIMU
REPS
NWBC_FILE_REPOSITORY

00056

LIMU
REPS
NWBC_FILE_REPOSITORY

00058

36
1
\\\\\no_empty_blocks/////
1
\\\\\comments_ignored/////
1
\\\\\delta_normalized/////
3
\\\\\allowed/////
FORM
*
3
\\\\\allowed/////
FUNCTION
*
3
\\\\\allowed/////
MODULE
**
3
\\\\\allowed/////
REPORT
*
3
\\\\\allowed/////
PROGRAM
*
3
\\\\\allowed/////
FUNCTION-POOL
*
4
\\\\\allowed/////
CLASS
*
DEFINITION
4
\\\\\allowed/////
CLASS
*
IMPLEMENTATION
5
\\\\\forbidden/////
CLASS
*
DEFINITION
DEFERRED
5
\\\\\forbidden/////
CLASS
*
DEFINITION
LOAD
6
\\\\\forbidden/////
CLASS
*
DEFINITION
LOCAL
FRIENDS
3
\\\\\allowed/////
AT
LINE-SELECTION
3
\\\\\allowed/////
AT
USER-COMMAND
4
\\\\\allowed/////
AT
SELECTION-SCREEN
**
3
\\\\\allowed/////
AT
PF*
2
\\\\\allowed/////
INITIALIZATION
2
\\\\\allowed/////
START-OF-SELECTION
2
\\\\\allowed/////
END-OF-SELECTION
3
\\\\\allowed/////
TOP-OF-PAGE
**
2
\\\\\allowed/////
END-OF-PAGE
3
\\\\\allowed/////
GET
**
3
\\\\\forbidden/////
GET
BADI
3
\\\\\forbidden/////
GET
BIT
3
\\\\\forbidden/////
GET
CONNECTION
3
\\\\\forbidden/////
GET
CURSOR
3
\\\\\forbidden/////
GET
DATASET
3
\\\\\forbidden/////
GET
LOCALE
3
\\\\\forbidden/////
GET
PARAMETER
3
\\\\\forbidden/////
GET
PF-STATUS
3
\\\\\forbidden/////
GET
PROPERTY
3
\\\\\forbidden/////
GET
REFERENCE
3
\\\\\forbidden/////
GET
RUN
3
\\\\\forbidden/////
GET
TIME
2
2
REPORT
NWBC_FILE_REPOSITORY
2
4
3
REPORT NWBC_FILE_REPOSITORY.

"Begin of code section: &FILEREPOSITORY


&
"Generation details------------

1
"last modified on: Tue, 19 Feb 2013 12:47:
13 GMT

1
"last modified on: Mon, 08 Apr 2013 09:52:
08 GMT

9
4
"last modified by: BUERNER

"Begin of code section: &REPOSITORY_CLA


SS&

"Generation details------------

1
"last modified on: Tue, 19 Feb 2013 12:47:
13 GMT
1
"last modified on: Mon, 08 Apr 2013 09:52:
08 GMT

3
CLASS
LCL_NWBC_FILE_REPOSITORY
IMPLEMENTATION
3
8
3
data: ls_area_info like line of mt_are
a_info.

ls_area_info-area_name = 'CO
MMON '. "#EC NOTEXT

1
ls_area_info-area_key = '20
130129091758'. "#EC NOTEXT

1
ls_area_info-area_key = '20
130408095208 '. "#EC NOTEXT

56
3
ls_area_info-handler_name = '\P
ROGRAM=NWBC_FILE_REPOSITORY_SRC\CLASS=LCL_
HANDLER_HCB_RTL'. "#EC NOTEXT
insert ls_area_info into table mt_area
_info.

ls_area_info-area_name = 'RT
L '. "#EC NOTEXT

1
ls_area_info-area_key = '20
130219124713 '. "#EC NOTEXT

1
ls_area_info-area_key = '20
130219124713'. "#EC NOTEXT

155
4
endmethod.

method if_nwbc_file_repository~get_hash_
for_all_areas.
1
ev_hash = '20130219124713 '."#EC NOTEX
T

1
ev_hash = '20130408095208 '."#EC NOTEX
T

LIMU
REPS
NWBC_FILE_REPOSITORY_SRC

00056

LIMU
REPS
NWBC_FILE_REPOSITORY_SRC

00058

36
1
\\\\\no_empty_blocks/////
1
\\\\\comments_ignored/////
1
\\\\\delta_normalized/////
3
\\\\\allowed/////
FORM
*
3
\\\\\allowed/////
FUNCTION
*
3
\\\\\allowed/////
MODULE
**
3
\\\\\allowed/////
REPORT
*
3
\\\\\allowed/////
PROGRAM
*
3
\\\\\allowed/////
FUNCTION-POOL
*
4
\\\\\allowed/////
CLASS
*
DEFINITION
4
\\\\\allowed/////
CLASS
*
IMPLEMENTATION
5
\\\\\forbidden/////
CLASS
*
DEFINITION
DEFERRED
5
\\\\\forbidden/////
CLASS
*
DEFINITION
LOAD
6
\\\\\forbidden/////
CLASS
*
DEFINITION
LOCAL
FRIENDS
3
\\\\\allowed/////
AT
LINE-SELECTION
3
\\\\\allowed/////
AT
USER-COMMAND
4
\\\\\allowed/////
AT
SELECTION-SCREEN
**
3
\\\\\allowed/////
AT
PF*
2
\\\\\allowed/////
INITIALIZATION
2
\\\\\allowed/////
START-OF-SELECTION
2
\\\\\allowed/////
END-OF-SELECTION
3
\\\\\allowed/////
TOP-OF-PAGE
**
2
\\\\\allowed/////
END-OF-PAGE
3
\\\\\allowed/////
GET
**
3
\\\\\forbidden/////
GET
BADI
3
\\\\\forbidden/////
GET
BIT
3
\\\\\forbidden/////
GET
CONNECTION
3
\\\\\forbidden/////
GET
CURSOR
3
\\\\\forbidden/////
GET
DATASET
3
\\\\\forbidden/////
GET
LOCALE
3
\\\\\forbidden/////
GET
PARAMETER
3
\\\\\forbidden/////
GET
PF-STATUS
3
\\\\\forbidden/////
GET
PROPERTY
3
\\\\\forbidden/////
GET
REFERENCE
3
\\\\\forbidden/////
GET
RUN
3
\\\\\forbidden/////
GET
TIME
2
2
REPORT
NWBC_FILE_REPOSITORY_SRC
2
4
3
REPORT NWBC_FILE_REPOSITORY_SRC.

"Begin of code section: &FILEREPOSITORY


&

"Generation details------------

1
"last modified on: Tue, 19 Feb 2013 12:47:
17 GMT

1
"last modified on: Mon, 08 Apr 2013 09:52:
09 GMT

9
4
"last modified by: BUERNER
"Begin of code section: COMMON

"Generation details------------

1
"last modified on: Tue, 29 Jan 2013 09:17:
59 GMT

1
"last modified on: Mon, 08 Apr 2013 09:52:
09 GMT

3
CLASS
LCL_HANDLER_COMMON
IMPLEMENTATION
2
59
3
when 'general.js'.

concatenate lv_string_base64

70
`7X1rdxs3suDnm3PyH6Cee0IyokhJSeZuJDNZ2ZZj7
fi1ljLOrKThaZEtqeNmN9PdlK3raH/7VhXej26Ssp3
ZO3c4E5kECoVCoVBVAArATVyyeVl89+24TspZmsd1U
bIRi6L9L7+4CeSN35XxfJ4EYKrrJMvgbzxPMHMWp7k
NMCnyOsnr8WUZz5JxOkUoK80Gv0nKKi3y8XVcXfu1X
SZxvSiTCnI+vEvzafHu5TzJ0/zqTVpfPynK2R6`"#E
C *
`ry0VyZxXigOMc6oJy/NcAf1lQ02KymCFR0xSbKX8O
rpL6MEvwa/Xw9iS+egEFu52nJ8+fdXqn2+cDBP/9dw
0vfkdZXUb7w+HF4opdpu/ZJTD4yZMvv8D/YaXJfDJ7
WBbvKmIqJwGqGl/wtG4PiLtc5JMamBHKZh++/IIxll
6ybh7fpFfYS4ObBNpWsq++Ym7aAFqdvH952Y0O5vMs
iXrshxHblljgUybA2Jx9s7PPhsPDV4+eD44Pnh`"#E
C *
`y8PtongDuWZFVyj9p+KoqrT1TdAtp9cIUsVtifpGV
yWbxvRL+r0T9/+X+Onj07WA//8+Ojw0bkBm4AsxC7o
NsK9OXJ08PXAvbLL+4C0vBXPgBCQiEHxxLh0GCGkFj
yNgLGGw1CCqjNUGkrPwRtUW9fFkXUouiIbQFS1WIJw
TlNIJsj9j+8DnAI270XYUoQPh9h96KLC9C9ifpOSYr
M8iXLgBBp87iskidZEddB6a4WF1Vdgs7kpPSQP`"#E
C *
`EsQX2VxDepqZongXCQ2yZ7OD2omma1Z8wYMxfKh9e
Jk/OrZwcmTl6+fe7xYVsPzeNKsePTgPXjUXMWSgewX
JEY67Jlcx/lV4hnCbjqVdDVbyvQJ/jiajiO2ydLpvm
JtwD49vD2adjtpDpyYJGPBGSCj00MdvVaBQR2XAIdi
2rHI6hisvB/GhsbK4cfY8iaCK5KlE0I8BjGfLmmgD/
5xzWvB19441TJKrwZZkl/V165y4ZnoWoAIsCU4`"#E
C *
`LXjh4SyBX+LZpIIRqxOwBsIVKJSDyB9GJTh/AEfgS
s2QKsah0s2Td+wxQHR7PaTkJEUoPWBCPpS0NzCoL7k
FYe+K8m1cFot8Si7bRTx5yy4Wdc3JuIDmWUaAiFnuL
po8mGRFnrwopkkXXdVeGxu5vAk+gZiVCQ2sR9dpBuq
DcPbXqLpnyuFS3bTf1BHxdHoIfl79LK2gEDCyuPi1z
+rbORBzmZv6HzIGLrQh6aHsrsQD/8WggiXNWuV`"#E
C *
`TqbqOJ9dU0MWnc7oRuCqgNhVlrVq6TGbFTbJGwwIF
HFpCKFdq3jRpap6Rs6R55twmQfjncR5f0WxDtpwPIj
WMxvPFBSg2RmP+w92+zsgE9ZWTkdJX+ikKD8o4rXiT
jYrQTpOoxnU8hmYkE7Nd2OoNYkxxSYA4MMH2cS8l4h
OMWSLV5Q9gz43SyjirgXSnRpSuDoeo8QsmaLIdggBR
vW7qKdZ5LkjhxYgUF8Iky6IK1Uc3HYHLkD5oKL`"#E
C *
`Sfbm7ahZCTDuxpet41GbdvgN/ZbcYm2b2RXCGy0u8
L/PlH9EErbzewirgs49vIxuaCAv2n5z5yxeJ2DpuYk
R4fO2dPz+kJp00+vwOUDuaL6rpL2PZVnyhcsmOon+7
IPAVUESjyX56+tjxpsWrxy/NnT+t6/jr5bZFU5hgaD
tkETApx5OjwPzb7TEyJ+uzRdVng4Hs5T8q4z47jy7h
MHb+WjKeNvNuzdVNDVX/uw5/vQugOoEk3yS8vS`"#E
C *
`WrBG08nZVEVlzU14uTkVdRrV8hVkk/HwAdjGao7KW
azOJ/2GUxnjmagzp7EWYY22uQVFzd/fWvDkGdQAG6+
4Y5t96y+N5AKArjkGshEusZBSCQ0wB48fPn6JOL4gI
NVEpeTa+JhcXzw6jiZLJjQTXXB0JesrxN2dHIMP98m
ORWry1trBmoZ7bAPQg5E2NvSeoQ0eV0pPPkiyyzdaF
eETUcQa7SQmVAtGdm0DcSvN1yIFRjwzapLDk+N`"#E
C *
`J1QVQhnUttXUxJEIGPvk9cHzw53IUqeCAI0+2FYx8
I3WqgJrtNRUIs73P5gJu/8FmNBEA8kdDRFXcANYBj8
l9XFS4RLWCRbxG6RQNZbpurwyXDddaFxxTKDEqmqla
qwSLSxitkmlMr6t5ummtfZo0HMiQwWqtZMfI450ayf
Q675q3YTqf4z2XUjXdCzB8FUAg5sQLPh/jw8fjY8Pj
49PXv7l8MUIvWLOgVVkTbhOMKGfXHeT3oc7UM/`"#E
C *
`xZALdgKp4lZHF3sUVmyZ5mkyVawyGy1w/I3uurckG
/DasNwebF/PFPGDttMSZRulO2gR7WbK5XvjAr0ExBy
GOfjo8ifoeM+1JiSVqVPZdWl8/KhNoap0CIFlUmCkn
l2meTEFiQjAj2pGxSchhKj+9rWqYrfMJqDUp+UC1Xq
fVgMCOEWw0+hblmlKx3KLaGO1ub3tpYHTjLCnB33h8
/HyPuHFMWdRHNF3S4PAr6p/lLC9qFsPUHvt7mm`"#E
C *
`TgtZTs1euX3327BUho3gAa8s5qAjonXWs+TfLDQIB
sp9p1VGhU0cTfGhZkg2dXphXn6x1CY3cjyLX1NCQMq
nKielt3owdV32bJ4Cat0os0S+tb9Eeu0yl0kTXgVM0
XxfR2gPt9+VQsNcyudNWBQb2q/N556w/+9mPIFWzEv
NzrUzuXS7w/CdfsBQoXnMZPYy0gUV8J4kgNSQ8Q0x8
tqrqYPQZxoqwkRzf659dHj4rZvMixk120vT6Lx`"#E
C *
`hdZnL+FwRpdJ+nVdT3a2d7uv0un9TUOgH6ZVOl/ov
D2s+SyxqRvd/sVyE6S/yJ+1cV8tC3S/jballJkqQ7R
uEsQgUrJtSnTK3RaYEmFzz7HixzXSccw1KeZ3LwcDp
2lNj5P2WPPU7C2+RXjhRitXbA0F2tt1YC94utwwNtF
NqXBewv+8kWChdKqyGDUTAdmE0Ghq/Fo7+rgRhjqEN
F84BR5GuJnlWSXdq52pqYFbnUTCgPaze9ZumDd`"#E
C *
`ui3Ti7V7i2URZxJIh6E+cZ5gj+Ui53DQs9LOfQuG7
s7SJ+EKLmASWSZ+NclNzWuisflzXsU3yRRl+yEV+Jn
Xh1Cqyu9klbI/hN6DeeobZKVoep8VMPcpjydlOq8r4
db1oWcPMm4PaKGdDBWkwtftPoP5JocXhZ8CYJ/xVfm
XZXqV5n2WxRUabrv+d6Dfki6nQHWB+EldYMoP/wg8T
MLtuwCqPQLPPC6BpR6YI5xaYwca6hWGj2qorql`"#E
C *
`9KRgUCPQhLgQ3otNMV9gbcFUEGfVCqIxlGROrsyTj
FROjxCxymp5j/Qc1KO6LRZ10O2iNt/J3FxMuYY+Tao
7SlZQd4QWjbcXVJBauwWewcE8agC8A8i3u+oGeuYZe
RRehGAwG4QJ3geRQGvmAJh0BOeMfJdktrkFbX5goBm
gjUWXXyft6+Gt8E4uSSwtWZh9EjX2AVorzvwHjcNgk
9ZQJf8wxC6SKwTbICr7hNgDLUheTIkOLOhyiHf`"#E
C *
`VArovKH22yCm3UvmkSQp+K6OsmFgHCZkk21MpoqVo
JcD3NQQVjpBGS0DU0vLARnrbucD3dscwBX6iHMSmGp
LX5yAfjNLlYXF0l5b7YS4RRNwcmPoc5ELiuGm3n6w6
oc9Dhdz0wJU080Q7iZ2jhjNPUcU0R2dcbsLsgm8RtS
TSwegUOrNbwpS1fotVIn16mZVWTX90mBRo+zcFfqLl
Z7YYMnYnxnj2icZluv6qsaTivpO7EiOsmO9yNN`"#E
C *
`HLtX019Hok+99wPr8+lO9RjFd8ALhZ1916eUR+8f/
hj79DemW5xN9nl7aFG4KyS1Sn6rzgBhnphuGfx+2TK
uCf45RdLfOLwVgAhsTa7UbuJbXRL49GujnLn8Bf4HW
TKZe6gmsPsrxsNop4GJCA559HFxODQcKC8EnBjJmQ/
uEcT6fWM4d+7Z9Pfzwa9zX8fDmrcPZCV9lSQk14GoK
Uns14KgPDAsLWz+D2xAGrd1YUVmacmmi22Q1s5`"#E
C *
`EfS/KrcJuMO1PhgpqEDl1uzI8/oNRlVZOkm6O73Br
0WaE3Od5RoDaeNKgYCUvh6TmyKWEOwHBO1eUmZE7/K
VTdxaxK1dqvkS3O0Tsn97wEouAcVFfjTVP1FHPoTh8
yoGtVntcQ+dcqCUmSELwCy1yG5ggvYcprw6mZvZk7T
OjMSZAAEGhMdEtbiYgRznAGcOjEuKWGtc7eaByjokS
fYTFi2y6fgmzhYUWHxJMWTCLqHn15kU8zTpIBT`"#E
C *
`jUHsoTBoV9FuaVX3astFAbAbzfZiWYuNhqizWBnn4
z+w0quI5+VBb0KGQfTtO62QWnTtRhjPgUJoj2TsY4x
IIVcZ1jbLOIvajYA/ADuC/8c6AF36WXNZsryHzNS4p
2FtBusrddavcbatyt7lKcEML6Jzi8rIyo6jibLLA2f
zYym+MC4uwliwGYbmeoxHoDW6tWlTWuC6urjLUZN2V
kWGjUczbIs3cMoMJ+KYVzpf0wjqveiyW3wjt1s`"#E
C *
`46SNciIDx3W2SQZewN/MiiXyKGY87uFlMy+cBoFNs
Byby1bmyKLrRyG1fdTNmSaXbny1S3swx6MdusvTECA
9swFecItqylTszBheuymsDIxPyxlw8jGaO0/ooN81q
PysdrtWh4E23uNojFXrBTna0OqpvfFmn5ttpCNfg/v
xl8B2YtS26SbIdhnTB5pS2JGFfcORpzT8NLcesQH7N
vNk1ObHp6gpdsh0Fa91tqpU7YtHq/FePuCrXur`"#E
C *
`lqrJV8rwJv9vgK4K6hmkeUjBt0zIzm4Ut4seeiIKC
ZYHstwSCJeZkqbYmw0kDiGNDRAeqQPh0qdaIcS3D0o
CbAKDM2isLzBfY/3VgjrzJraafuKAi4NomErrVXS9w
Ph8Cut2fk5r+bJJL1Mkymt81DwvLU6el0W71jy3mdg
eGna4gZ8t8JJtWPAGRgJ3WCsa1GkeSJUaziaiyy9CY
azS2puo8LC6kCyAjsDHiIeo7XJoqa9hHDVVMTY`"#E
C *
`ZzXljDeWysWcV5u4q4vDUMqB8FPhtzhG0N3u4w/eI
OiUxr2A5D24o3mcmd4bLuo+S/O3j2B8BrZyxHxQlmR
OIJ6bbRjoMIJBBoMoNdEY3LdGj+h9VDBMzR90uhwmY
76fZEiIIcU3tFBXl9lfklu0WLJVuslEyUVRZEmcU4v
sLJp7etGBgqZdsz43bEKG8aGDDNNi1VoHFc2kAGagD
yKYH7+VAjgcAPGBeRhUBYs8/W1BQUehWIBQVVF`"#E
C *
`WbWkHe284jDZtTF6kgBsqYO31CxKHw3cJqxZzmL8k
DL5exzcJixmv1SoebnwT00kouHCFhc4sSAkD0bik69
TUx3kQ9TL/5v9n7sSaG3T7lsZzhh/g5zs5Y1UxH4H4
92jaZ2VR1Pgv+RpHU1MfTmKY9mfGVgSzhikeh3HHpp
FlRQQDlCQscmY6oFoOMBIU6nGKgcNa5nuTAuxPPB+g
Edwrcr4e9kI0BhkTSLN0K0kOzmJJkK78FW0OsZ`"#E
C *
`WC46w43Be7T/ZCEBkCMhW4/bQP/zxQ9EvlDlzY4Jy
DfDfM12CfLAcq2lII3lBR3SC+gE4xygZF09TuFMgnU
IiuNHqqkSdltoVHcSkcyA4HXloibOZUM6ywkGWHKVY
KZKSwNUr25wHcuPFcDJtw9TVaMTVJ+xOeG3ONM5MWU
ls/PES33Wdu2XCINmN6b9dbnGRdrzJNK68TrfGf0Bo
v57xVPy5lBu29LRFOTAoPCk1mlR16jWWEiqDTU`"#E
C *
`+T/dxzhFsWaulGqmIbZ6bOjyKWXucfxPr6Wx0d/DV
UTGtlUk/Tx/LEsOUUhkADpDEaHYzRF3+HmHueHgSWC
eRk4MK0brYuIGg0c4oBQdwg4hle2tWC+o9BEQZVkH0
0B4AhQwOSOarO6WqFvubFq6tqDqF1Tf3x/UpvbLQj2
9QqGxuOv64fyDxq9MfxfrOMOFvMprotBymVZzOiyhH
EGviP3+TwHzYvjsbuTL+fjpNfoWYyrZCgI+65a`"#E
C *
`apTnoM6U3Xma0gJ9S2Uo9y7pq9QdqhI7sS6TNmtCp
RHGk1BRE+Y1OKxiOXFyncPEHxyOl7R+vuqynF+dRJl
W9VF1OJtTjJ5lIF3QRYb7YwSVJA0D4ednDXWpUfErH
xW/wqjgCNWw+DVwMskiQAwRXuz01/NgRaxdz1Bfbje
pmiCWlPf8IhtLU3jUNKvQhbEgD4KcphXoJ4qAvADP+
60fcWx97A4x/N82OgWhcv3DXLmEUeKIjalLMTL`"#E
C *
`DWR7GiWMYHQYoroyPt9XXNv5HRPjxYkpmvah35+OF
aVufFQZjRw7GzmoGO/hRYv2Wi/VbEGsaHlKo37YJtU
WukG4sffq2UbbV557GNIzroy1s8OOZ3eCnvSNbcluy
ms4AGJ/wCM2L3LMIq9QZTA8mkkExxzjXuuuOq8bWrT
WafApbljTYckfKuhRETEXDqwM4+DA43Qo0+Ij9VJga
PeWr2k3bRvbeCZahY6C6lEYhwhY6g45RAyp+Dd`"#E
C *
`zp2Dlyz8ZMB4Qv3jx8ZKRaVMrEkMNoktbgN5ICEEH
jpjDYdJqITLeyZZYDeA1WNC0c263BvaRBp8nxtwHbS
eJ/na4x2iT7Zkv2zUeyb8S+9fkne3Mp9ziWDb8XZN+
LTTavoJEfrOROHKteuhNjbBqttPcjKm4pYQMLwkLwO
H4N4OiXKLAttM4mzufai/GO+dbjSVG8TRNxSQC1AO8
KuK36bB7X16ZSSt7P0zKp6CoBYylyA6HNu1vgp`"#E
C *
`1655/VjCewmdU3IvkqWKzJd+qEuD9nsIp6vd7/9+s
/b+P+d7e1tubgjCEFO78sfo2iTENTFT89PjvnykHno
y2wMY9Q2vWCsI1whmcK1ZhRmNhxsYv8OU3IGo2Fkto
nHNNXXYcUgKgAC8RvfKKom8TyhMpYA6NBi6goR4bQZ
QZNEEb59tCmauokYNqP9phM7V3avml2oJFS0JJcTwF
HkWINHhMBaCOA4pdrZX6p2BIoGtSPswiPZZrOI`"#E
C *
`qWHolAApYp45mFzH5UHd3Sb577COp24USl1GLxnu9
I1kTllgKUqofgEmh5+8m8GPdVBKwqvPuLmhrWbmuhQ
BN2KRW+LQ0PvTJEvqxB7WpvCHR34U9bd2BOB+0z6iu
Mxxxi8zQQb9XGZ0AARyZE0YfGaKHM/tk6iRin4Vp+X
M+Q1KJe3T9id8yeeLus9+WyTl7bHYl4m9nQ9dqXu6T
OfY58lUjw2HFC02LxO8HLLz5uhxB0M7FlUyxbN`"#E
C *
`OmIenhSS4UdNIQG/qG4+8+47Mw1oqFNC4BrOr8anQ
XvMMHTHQO1TMk4MRLRyfVmZ0SK6lb2SlOjBZRwLHLS
cdYutkQSzjFHhNVo66kUvXbuXTZAO1kD4Wucdn3fti
BrKH0w8r1Lv5gGRskzXJUnSmG4vyi4GMohpQXLzXxA
DMtnhgbtcHGEHZ7bwgkFlSXxd0UQWeDF6pzRQ2YUAa
gwUj6zgpMub4x6h3unNOFizqycQ/0WEknmggsk`"#E
C *
`cl4DIwy6JfuUyQgRl24eYjRzKMWMNijIR7fUdep7l
7OsgqJQyljUXQOHKPwZBWaTvii/nBQs4BHByndCJUL
BMtL4FEQolp4sWJWOSr7uitgJNMwCpIdxqQctk1zxl
jLSaQcUAAY/eZX9zwZlUhfZR/lQEo5ViqJN9r5sOm/
XBseNOdKwIRhdPTBkmFMTC8a0vkL9tRkONE4ODb7Sv
g4IBBHIsy4zctL6VD7wM7KEgFi08TCoTxSwJbh`"#E
C *
`VHCkl2uy9HmiCPPvR/5YsyeWnh1DbAfIbQsRGjlGK
FQPEMXAxN68qSJvvbA8idzHqBjXC9mB67gmrkXxNIW
I6XZ5F8Wp/pvg597sCmJb8YxaBg7PomC/2kPZrzI/K
yxoF92pN6ucb1hDmmyVKfQN1HWCjuq3qU0ajgA/sEl
NTcyaRJD+3D7Ys9bEhOnOCT5TrPNj9nIcTh0iZgZWh
jlBOCSc5gCzdoWAuhKGFExBxR7ZTAO/PTdhnRj`"#E
C *
`36hpldHo6OaGsuACoxU9bHyXYmB2pCUE1jSlMcZIS
FFfK6u+7pe+IpyPKX73iNlI67yHQuEfyNLXAWuVou7
Z+GAPMnRNBYyH0r3aorX+BqUPaiFeZLV0t+WN9Xxp9
d/U+CMHWw8+irNCc/SULnmgWayT8wbvfBAZPMuI9RN
qjHaJCJDPTPPF7IKORmuuDocvinzr6FAl2NXS5dFHY
MJNjCL3a7Y9+P47Y8Jo0RUsyTPtgkZ/GQer+Bf`"#E
C *
`hC6E2acxE95ou4UHU1tX7QThOfM/mwdEh+/MmzrQ6
VR3n07icYlz9DBy3GGrH8LvOMgatVO2qPFuprQ4b+T
9ClnABRVwQQveOGDRvsmj+XgqaAS5uEVHgvJJGaHXT
yOg2qUIAPND+AppkQvC/+mpyAG9YNTBHJswe+MWBR9
P+FNzw1wmeBDiYz/nVS+5CgjrFNqCTajiyxB1N+D6E
4XNkxcRfcuPZw+FBxaoCyIkrDA69KmpWgibGif`"#E
C *
`67i8k3g21xwotf03f0mB/wygtAmuPFqhcJ484szOH
rgmB/fv2M7gpgaq3pf+Nchp/dVGfZN/Ek+yam4KlJ+
iIXATejH6315hHUIHj0lcpQmmkUbRqM480y6lTX946
h6Jj3RVfm91rAzUc5rAKqZZ5G46uyzT33b0yXWaI4/
TUNfxGIKJLBmnqRISRmfvthnrrGxpd/u7nc+rLO9vG
BG52jKvMS284BcIL4hWi6zEi7aRqgAa+7QqzAw`"#E
C *
`K2+WuBJapsqnbwOXbJUO2Uu7kba+JVrYinGIdDJW4
dKq2g7qcFaGunFA5A2lZSyDm1QoJ0iA2MjHaBmZm6H
irR1aKEi7dRYWKXDZNzXb+9HUZjue3cA2FnrEGiWbK
czVIdDrjBHarmsSU9Yig8mW8KZ1D6vCRBcGVUhw3Tw
RpFnlmu/DcyEtFShPovT0AA6+R24Lt/YdP+4kOtgvL
XhlPLCHAJPWnkx5C5A4/62efWtrKbtqlO1mSaD`"#E
C *
`ZTxSzAmSXjAK1lGVk5Fb3iru7ZeEty5wvwN8qGkX/
4z5te18/2Ps7pEhBMWV99n765JvVOBKQDLN4F/RKD6
zEr2JJdjI330zK9g3TKi9ReNDmReCC+R232Faw3Xg9
qk50X245SEvP3t48Ogv8lUFkGvwnBJg0qK6FofkFY6
gxXZdoivBVz26FIPFnqf4ZZ8U2BBe4P86fvnCljYjw
17JsfMG5L0z4+pK1DihU1ZiPFC2u1W0gamW4Iu`"#E
C *
`BHbjNVuRsdIenf+/vfbg7Oz073976fnC2tXkYJ5dZ
Xm4t2Fl+Vp7V5+IeDsKuQsai7tnZ4PfTv0dnZ+e9ry
MMH+t0ej06VJ6Aoux2urizhIXgn06v02sRdPiAcLLG
20YhU9w2+urlMV43SvLs3DCKQHSZJt3uq5KFOHc1n7
sICf4gKMcqOUFO9gx1j/CRERLCzDVgZhrO+wq1uFb0
8PXrl6/Z0Qt2eAwzgNeHJ6+PDv968IxtsYNnz1`"#E
C *
`6+YY9evvzL0eGxEZPnqg57aDTdqGh2uGv7lUDzVaK
Lam6sDRnKAXF1cQM/nW5GPY2V6xHIHZ51T8/ejc42z
4bnm2e94VV4GcRBuY9chw7YqmjGgegDqC0oqOXs67O
t801VBf2l+wN9BnjXEkv5FdgtDagv7ul9kH2EXWMSj
fdzJNMNvMXVqdfqFs8cfY56w3f0iUv1pDiDnC84DbR
FpqJ67l945bY0mi8RxYgRTGOuWngCjB68O0wOF`"#E
C *
`bzc/rp4N7xOpwlb5FVR1jAfxiBLfpo/TzAqBSfHdn
m54qxsoAyF5kceMBjXgudyJNaiN2zgQVqN7RQ9kJvQ
yqLuWqcedqvXEQJ3oltpdQ78PCd0pL0Q61DAqRXaZ3
PFChzuoPY1wt388MJl1RGFq9Y2yYoqcaPrGlZJDWHq
XhYZyAWtDctk6/wpz28/YqFwGDGiiLy9lK7OcGh5Ka
+//O5qgPQ6SdHf2DmcVXbvNGK3+6QBudkX7V2g`"#E
C *
`o5Jx2OLJA+WJqgSMLFDfnV08FSe95AyMd/7lU5yhM
Z7BWFJcQJkFAeMzifCEmLEOCYJ/DsJH2AkjvQjWNdk
TOB0AvTkWZyh/GOlpo8S0CQ6shHAC/1bFvLsU864XU
rjOGRV0m7RwbPCrxRNzV7QFmxNIr6Ta3q23ClzXs4y
WijV0mBMIrHuLSmzK1mt/JSQDNo5QrzsEaBG0i8p5c
6hyY8xTpJ/FQvxl+HSrcNC90H0ZC0lDrMdDXuT`"#E
C *
`TMdEhYRkXg9XboW5V+p88CC6k8JruEyvEIDdtDiJi
Iy3D7/fYtroM8RZ+8Mq12RBTPIVrYzQyYgRwkMgsyL
FeMsGqBnjB4ZKr1mT5Aade3LHmpNqXqxFqNBoO1Ekx
D6wkIfRy1hGH78Upl1cr71m6W5aKYx6GfQvk1gHh+2
HB4de2EbnS3txyOLEPaTZrjV1I1eZVqPHZsBJt7ZxB
PWLvywrNEt6MNTL9HVhq+neD76i1cZ1eZElzQ9`"#E
C *
`1qWlrnVXpfMZ8XlQrbYu6ib3CE+rd5BnCOs7pUeJt
9vxYEUJWPYGlbrHqNwQtZztiVcT9cN5KSgV61RrQNA
rqEIEyFKGZlAtCIJuJFXvG4ICPOoqgGdFWrX/u+CXP
rw4RVGQCv0sUWNw22cNSv7UgMWnlpb4ddLgQsfvDhs
uUiJHZvOgW5ajQbGe45s/LP32VN3GDyoS4nruqzs8Y
UI6Oyj5Yf87rci+dxmvO9hqPqKE/xhSOmDuoHL`"#E
C *
`m+2rKVWIGE83h0s4dW/NbdqvGemOFVqYyio9Dcaz2
lfF4C2SsqbdJKMZ/F8ydvbFmQTKQaQTU/rK+CWS9mM
3Dt1uyLqnWaUkK1g1sK5uwLO3Y6j17X4QbYc81T7ns
LF70xWQx7XDoyfszR/ScJOAT8wh9hj36vMi6tXRbXH
/vxnBa2u8DVR6Kt7hUt315d07H4EHS4Zu7vrkiGviQ
6OPWIr/Ic3m82M+6Lvacs1UjKoJuIVjbmBAW1P`"#E
C *
`EEPTeTpaCRqn+WVBD1NDxnyH/u72vvyCqqPjdSNur
9JLekp6sihRuR5jWTnluBm5OaeEjO+fUBuEJpA+OlS
P+9KLOpk6mBoAiMKI30D8CnAnZX1LBwK6nGBd081IB
cHd8GTBsJsGC97SCUbvijkGT3bfqXOGIKA4JTTnA3G
94sxZ/hWrO+3rQ4TCOaNO7xfxSXvzHS24SL/sLixEK
IeN9kkwFYyJHCkv+DXhxj0l2pvxC4cOTRLNLac`"#E
C *
`ls5TzgODMI5J0aJPnEUzz3Uz8/SFdqprHOS8YN5c7
fnXwghdl8mN7FkbzBELTR1AV0lMcdoEHASlwFZW9SO
/VuByBuYYu6eMru+9EKKiDdEsqKGfki8L9CCzaNM2v
sNsj9WsLH4GLepsrFSU1apQt6XcPr4jtzN8HjsnHS6
l2SnJJWKeEmzsK6z9CfB8e2AUbOCDXKtZSJZZV8TTK
iO3ogBczV9+X/2CkBziAesNaBsi7Fz/IWw+ssY`"#E
C *
`t3bYWuJWkjYNPtnH27uHN8wEMlL01zivn6yb3YykS
sXNBGRu6uw8hNV6LW5WxbRVsu8qZLflqR/MO5rr6Yw
y5EEwcU5oyPaqMhI7bVKl1yoJsG9ZiWI1cwq1hcLtv
iiZGOve3C8ewI22TgvbfVVVbKqmH3U9Yg/C2L7RZmw
4CFtdkqnkW7ltRt5Ktmx3w1N7zqa67hWsqG1BteVdY
mAPLCMl0RTNZ/0GPVnBpZbOCShvebXNFroTBRS`"#E
C *
`MV5584229bGwxKE0Ku3Hb5JEiixu1IJZ5a8rrLnQ9
VT1Lu9Bt61KrwGZDv3ZOMW3SjwDfvar4mmZp5X8DmY
Tb+yJMztNtmyA0bXbvbup2y23YiPa/e9mxRuzR/SGH
fELJnDudPg/85zOPJH/ztM4v41d/vX3O2fZO7GtzTC
kzdjPH/O2Rsn4fNO30zV9Pnmbz4zWyZwK3K3taqPnc
IJLP941t9pub/3NE7uzjXN44Sc/Wsi9xETuT9m`"#E
C *
`wiV68nPMuEjP/mvW9SlmXZyV/2VnXlzI7jn1Mtv+T
zT9Mpr1//kUTOjgPLxB2rqJ2r4xZ+3mm0E1F78+4sE
JxxzieTxvsRZ26IBWmzzwJRSvFarAnXlZVYeVLujIL
R5Ksq+Ur1v2AfpnPsIdXRu/i2OV6m5Fdbe6Oq8w1Rd
AKSoMtdxx3V1iTTFsKX4trz3xKlcIWkQhcPhY1/XkY
44eryoJVIkrBLLmNfufF9NdL9F4vb4Ev9PhNlf`"#E
C *
`aRoTghTkaLopympRo2kdNgQICcT/isCfFnByRSCZs
1cV8ixqk77Hoarw9o01bI51u+iZmsw1RdRjk9EpIQH
mJsGyahRyxdIq1SKQRDRQUyjXYrws5LWkTq1ZhRRjf
u4Z8FV3fRp4RC6UF1yzsHONw4/rNOEazlMPxzu63pv
3yY9Ssp7b1tUlSOlUWx2hRuJ5gq2L3Fm2HzCbxdlsD
Ir4D7qPfSEhWstHIQLdYsMdfGEcq2jo9t4PgeO`"#E
C *
`3rcd+s6tNy6bvvQ0z67nvFI7Pq9dl0Ucb50Sy+Stw
70wQPH8r8NgYiElw/GqcI6QwdjWFDhbWqQeJX3ySoC
k3rempf3N8VqS86stXvArtyY43U7YcHDqh5P4ED2oj
VPEMf7rbiJikvM7x2z/Q+QwWWSTN/BOgTiEg7ob94f
nI7/N8QPl7URceU+WUykspLULSyvY6rsboprdtTYb9
Gt1giYx3rtKV1zAdiYLUXZy8rIVzxuG4z+R/uq`"#E
C *
`7Va+1meUtLOg+B2A5g9CW1Dt60aLMIM9YqaFQEut1
8agjFbrZh3wKLB7IfsnrjDb5nrqHyJVrMo1sah5cZC
OdhEqVlEW6/laA8emMDXaMcLNZdDkPAFAWmOFzEjlO
qxj41VR5ROpDqzr6rXYHhffuMLwzZGBDXwmertjw6B
J3ruFwDfFvxOaD9l6DukDyhPLGMsOSa9E/UC57Csvp
NnIfiVsURwjrt1ThcGoZzwe7vZfv5HhOfLdu+u`"#E
C *
`1u7dP6Ldu0vavWu3u/XsivOm92c8XDIcMjrfnBVXx
eUlw+dKsco8oWv34vJ2BYmnovTSKXTVB5O34qAn7qS
BgmPWLUyr4Vt200KrgVQdwAMIjCCG1lO9SyIZN2gzS
i9TW0hGy5HwFVrC4t5Svk4gBPsMsRCsKRyCtcc7sPV
DHtiSqAd238AH9mkC2NmacRDsE4VChOpdLxrirrkJ/
/Ddf9aw+yt3cNIVN4vl3lJoU3j1Y0TmpzVIsnn`"#E
C *
`ne9/D5d/n3vzUZvtG4UfU6vxcYf//j+bkH8K4dfnU
/HgnW76Dz2yfNbxZ07RN43ucoT0f1yV1jiKmapZx7E
yuwvX5665Ny7K8hateA2TN7RpJa+NEYI+CJ3GVLs63
UUp1GnaDzttpbvCdWu6NcudXh8ePDl4djk9ejvEFaL
yy2vQw4CfdJ6ZCm9BjkIl8QUJM9OR0X/ykkpt4A6S+
IbJ7ehadfXX24OyHs855Dy+ItCtHSCEPTsaMdq`"#E
C *
`Q4WZ2os8c6X/22KOr9Dj+82fmKkuLZXKU8oJRMg/x
ACVc64axDKX/65vv9TqhOIIbp+zdZN+6zC8ka0Uify
tMLeo/ookEqLtMsg16ajadJHadZhfcaS5z2HcP82S2
6aE9f0Sd2V40r6S+hC07oCa79AJLiIm8tTRfaawfdL
lyndSYuf/ZL8me/ThAkfLFuEFcLKQZCd17lvIyqrkY
fz+iR1DCBmLcKZR66FhrdqF8bE/oU/BbZViQA9`"#E
C *
`rCY3r6SrxUw00CZgKC+iuwGHJDnwrhFj/kt9pF/63
VVLEpQqKCSoAWNbbWg9Guu1hVdysa2FG1bkgheYd+G
aCmJDa8crtK0T0LkkjvS/QvJ71vr+reat7LEKfMR7A
jfd97ACiW2xvC8b8Uursa2uoAt488aVm5TfPB5URnj
tZEAXLpGUF8DdH7R03xyAOi2KDAXjK6VH6jf/Cbu5o
XIZqoMcYj4DVdRWCmGi3k3osMkWM+BGZ8Er4qM`"#E
C *
`T5Adb1e94kFbA4DVcTqWYseXD+mFUvd1e4VZPuR9H
8y8q0KoydNh0QP+uiLd+s33daivRp1oUzVrM+qwdOo
lEW6VSlRC8g8PhoTyhzPjVj3R70o+NunNzaAfH7hul
VYuiEdpvrTV3pzH7iGPjcbl7SuzfinnEen5vbiOEXC
K2E0mOe8nS+7LHE4qZn10Dxh6YGCOafXdXyYNO26GC
W7w0FohbKaykXG3+xLnoxWt4Y+1wjleSgvkzAA`"#E
C *
`Ib/KEnxPWb/jxRT3Mwh6u+saPA3xdu89mt6+Tq8P3
c3puua5q+JPOkiydpbUJXZ1UtXa95IvLobeW3VeW1b
DxY1NUTdDI0PPJGMq7vb0t3nvf/VYTsGG8GZUd10UZ
Xxl7tgbZLPAIg7ZBBtcq+0VMV13YKAO1I9VHeH/yKt
hthMDae+EcQ3dxvNvNaJ134GSOvX2XVi/iFy6EOseh
3+5UeDdELLuT/EB3qWXQbO4ZXDDXTaQkMnoZmf`"#E
C *
`Ef3ejs7Pcf8ZpRfHIjSs3HnWQB/rSCUUdgGz98eZd
RJvhcjDNaVC/xEuJh4d8lTc0yI0ufnluTIf1OsgPqP
JTM0dWGmChINMZqteDN0eMhXvMT6Nva7FCrb2pbTGp
TNuRwd7rWNYUu9cgYoCft77Q9WMH/umXx3RHTeNrdZ
HIHuspcBg6NUF3k1yLN/a5SVyp5uJ015lbkahOiXWn
Ys8blWkzag2V6y1LTraJoK5eqXWGF0N4LE6mpf`"#E
C *
`lDBO7dsBV7v/AgDV70s06s0jzNt5D65BfsnsEXuMF
Rss7Xd/vo6umnQVEpjaecjioLjvcLOCdBm7za398BH
DqVAB3zSAdW6kT0HTsVlMuZb411D6JP3E9ttzKfjX5
6+Nt5p6fLnF8kOurwlA1nMbTaKMYHPajPnxW1K2xDr
15b18J4CQ9BBGadVcniTgEGJYMjsTYrZALgyL8oaDN
CesXgBXf84rfAh0zdF+fZVWdTJRGTYbxAx/TLY`"#E
C *
`+4l8SGgZ/+gRUxFXMC/mi3n3N3os09hekG8AgQNcP
U5LOrLjhGG0MMbIwlH3U1ZcxJlA0xD8pKsJlPJjgxS
459NwyjvO+1uitZMiv0zL2XhWXemXuKaIaSSXV1yxX
hVfxyVRMOE3/lLpSCpT5w0ymBp2vupsEpSJoeVtMf0
0nAvkPQVoDoZJmWCUntXvAiYYTikGlyEUoMegES/eP
Hz0iBQGGJYYTb2VIg4II/ybNOczxKd81q2f/4U`"#E
C *
`JzPy9eNt3l76rl3v7uMGOAJRcAdVJ/ov6DcPTyfub
/B2tOhGy2/Cp7I+H9dOYILF5ZqAOL7e1w5nayO0yNn
Jo91z4sLIP4Dk9dxR4iC/GRIf7+jpCxkXZHiwDrMv5
KpNbzomcERredGE2Rg5XNE7ddfxhOG6iuBl3JNpddB
IVafMcigkA4xDexRelByEj59KqPk0Fui5tjf1oflod
TMGFBsShRCSODu6EqBHv37EuHuhsCUQITpDamv`"#E
C *
`wpJxFR+zR2TVdHY1M6cslDztV1wg/ABp5xFgbG2Yf
kmyVLbiKqFhczHOKccdGyGUeT6bAj61t3hiik4Bkhe
F5dPU5jQGY2BstveGcTcL2vKvE5dPWeaejoMxFAB+w
qPKYWQ6PLMDVmuNvDl4//FvUo2Kq7bYf8Fd7BT84Cg
aUbHT15ffD80FCQhTj6l9QHNRj6i0UNNaRT7PTWtjc
VRZG5d2FgGX/KcglcHV8c4VNMWNH2MqREyEM6z`"#E
C *
`bES/IUCzYulBFMUDLpHYXDdrQP+fP2j6zSbdgvz6K
ypGETAii2xTZ5OGNiQ7SkxvT0WtRPsKPOslsLiP9sW
8aelDMFvBEb25EnUPBZaSjoPWOkQVqYe9gmcCB2yXT
zJIZfCNH7juZMeQuFFCJHyw9iaAXMu3RkPkOME+m6F
Z8bc8qUIfmtC4MLXFJ7VxIbbZWyQL+d4fGgLxr4eww
ikx9AsecOHKJ/uLFdgT3fkQAmFG3MsDS4Uz8R1`"#E
C *
`0maNsLXjmysqt7sCabtLSdttI233nqR9swJp3ywl7
Zs20r5Zg7Q793WOOR6Jq7i/gOKmnmVG5wRL0aHRxeU
lGbAP8kkqEScmCIHK9/SDztO4jvtA2mWCa9HayaGG4
Z7f84OTpwM8lFeYB4p4Jafp9BxZBjisYSt8C4mVP+I
rYgIsX7Tiq5bFAoyi38RBmcyKm6TbiTbxfV9Qh5Eml
X1NG1nuoo94tYGxK6uZ6dRdcjSasG+X5LU2FLY`"#E
C *
`aflOkU9P48yfHA5jxH+yNu163h30yHDKccLDLeAJN
vYXJF1gvKFvkMAXO8amsOiWPjcU1zIHist5azHtcFN
BRG8uCZmigPpgG6OdlegMaCDhMucah4jEdj6TJlHz4
m5LnMZ3tpwmWAZ4VdH4eiliVUYr1qrvo+w2J/1SDnN
vKOgQByOl57khl0n65hqD98nN67pxIukyzpGtnD36F
SbAnEKrDQ9WKsbbvNhixW+3FBLe5CL3i++A/He`"#E
C *
`Lz4JzHm0wha34s3N5wouQ6rhcVxZdvO6EyooHu++F
t829RxN839FjBV+aWd76WLTxjoqTGBA4oiS6H6nEdI
VYB7dYNhwJtWrE4Z4KeDDzvMs4YaGFIrJLscssYOfk
VU0PKbzXH57KniaiG05YOWRJqyBNBYcIMNcdnoEs64
YYKyRjbydQni7ZzBNdMOW7sPR1kEe4/XGGs6nIx4a+
OO6pCdxs40Om8bjj6Z1o/DuiccDIVB08NmUZRR`"#E
C *
`/OiDK1BcSCykeXEW/8QNdlQ+0EY/Efv4l4lOQrLGW
iIfx8aM2mrciqJR9yXUAGfsVGLvzZh7mmpT9uihL4H
T5tqCYK6fHGRpRNHlTMycXTQd8/oWfIM+RDp0/dpNR
O/fXbbz1SCxkhK3AgKL8i7YAOs2oL1OCVaEypocie8
rAQNRxGiHYJ3aZaxiwTGInzB10ZTGlmkZpIp6dOK2c
VV2ZE9TPgnvIxGFkhbl+jXaucb5PClY1lCTDQY`"#E
C *
`bysz5KCRGdzyUR/avqBj5ia+wPLXUlLMfg+SowFWI
OnxsUmWgXsV0ly2Yv83cVSeaYBK3QHUtOKnR1PfHBl
ZFc/TvbDS0xUZJq4bUZHI9SC4SpWDVOFDP+wRrescz
NNKYpciZzhpAzlOu5KAv/Kdlr3/GOxu02dnR5D+LLl
Jsj356xXt7UnoaGewDU4EjAt0BUAhgJ1Ir3LU0QwPM
4HTz2NIwSBBOtgcYWMe34L1TScnxXyP3A3CcSr`"#E
C *
`OP41wA4zlSQUm6U2av8wPsjSuRgR4zsv/fHACgrWH
TXhYFu+gYF9mSNqMPJGkQF7BTBgMwoxg5A+Ze/QKI/
agaRHRJM4WjHb67GdANdrus1eArgCtgfckIalE052I
kx0/Oz54dRTiN3UlX7T5fw==`"#EC *

70
`7X1rdxs3suDnm3PyH6Cee0IypEhJSeZuJDNZ2ZZj7
fi1ljLOrKThaZEtqeNmN9PdlK3raH/7VhXej25Ssp3
ZO3c4E5kECoVCoVBVAArAdVyyRVl89+2kTsp5msd1U
bIxi6K9L7+4DuRN3pXxYpEEYKqrJMvgb7xIMHMep7k
NMC3yOsnryUUZz5NJOkMoK80Gv07KKi3yyVVcXfm1X
SRxvSyTCnI+vEvzWfHu5SLJ0/zyTVpfPSnK+S6`"#E
C *
`ry2VyaxXigJMc6oJy/NcQf1lQs2K6nCNRsxSbKX8O
L5P6IEvwa/Xw5ji+fAEFu52nx8+fdXonW2dDBP/9dw
0vfkdZXUZ7o9H58pJdpO/ZBTD4yZMvv8D/YaXJYjp/
WBbvKmIqJwGqmpzztG4PiLtY5tMamBHKZh++/IIxll
6wbh5fp5fYS8PrBNpWsq++Ym7aEFqdvH950Y32F4ss
iXrshzHbkljgUybA2Jx9s73HRqODV4+eD4/2n+`"#E
C *
`y/PtwjgFuWZFVyj9p+KorLT1TdEtq9f4ksVtifpGV
yUbxvRL+j0T9/+X8Onz3bvxv+50eHB43IDdwAZiF2Q
bcU6MvjpwevBeyXX9wGpOGvfACEhEIOjhXCocEMIbH
kbQyMNxqEFFCbodJWfgjaot6eLIqoRdEx2wSkqsUSg
nOaQPpj9j+8DnAI27kXYUoQPh9h96KLC9C9ifpOSYr
M8iXLgBBpi7iskidZEddB6a6W51Vdgs7kpPSQP`"#E
C *
`EsQX2VxDepqbongQiQ2yZ7OD2omma1Z8wYMxeqh9e
J48urZ/vGTl6+fe7xYVcPzeNqsePTg3X/UXMWKgewX
JEY67Jlexfll4hnCbjqTdDVbyvQJ/jicTSLWZ+lsT7
E2YJ8e3hzOup00B05Mk4ngDJDR6aGOvlOBYR2XAIdi
2rHI6hisvB/GhsbK4cfY6iaCK5KlU0I8ATGfrWigD/
5xzWvB19441TJKr4ZZkl/WV0HlQhCr3ZBUUA2O`"#E
C *
`iKFkMG0I8sNWEKSBhW+0ArgubxSVuqwAf8P9qvWqb
Sq9Hh23DLg/vQIVDWy7tYaeP/hKcBmhNCFRyol4jAO
smyfv2GOA6PZ6yOPjFKH0MAt5XtJKgSq44HaHvSvKt
3FZLPMZOXrn8fQtO1/WNSfjHDruI3t3OM2KPHlRzJI
uOrjapDRKqeAeCGeZ0HB8dJVmoHQI5+AOVfdM6V2p0
faaOiKezQ7AO6yfpRUUAkYW578OWH2zAGIuctN`"#E
C *
`qQMbQhTbGRyi7K/HAfzEobkmzNhRUqq7j6RUVdPHp
nG4EDg4oW0VZq24vk3lxndyhYYECDi0hlGs1b5Y0Nc
/IWdE8c0aUIPzzOI8vaY4iW84HkRpGk8XyHNQho2H/
4XZPZ2SC+srJSOkr/RSFh2WcVrzJRkVo3UlU4zqeQD
OSqdkubPUGMaa4IEAcmGAxuW8T8WkJKBihZH8AL8Ao
rUy6VipqROnqcIgav2BaJ9shCBDV66aeYJ1ngh`"#E
C *
`RejEhxIUyyLKpQfXTTMTga6YOGQntpv28XQk46sCf
pWddknKl6b+02Y5Ps3kguEVnp9wX+/CP6oJW3G1hFX
JbxTWRjc0GB/pMzH7licTuHbVPHPELQDhA/nJ5w2uT
zO0DpcLGsrrqEbU/1icIlO4b66ZbMU0AVgSL/5elry
/8Wax2/PH/2tK4Xr5PflklljqHRiE3BpBBHDg/+oz9
gYiI1YI+uygIH38tFUsYDdhRfxGXqeMNkPG3k3`"#E
C *
`Z6tmxqq+vMA/nwXQrcPTbpOfnlJUgs+fDoti6q4qK
kRx8evol67Qq6SfDYBPhiLV91pMZ/H+WzAYBJ0OAd1
9iTOMrTRJq+4uPmrYhuGPIMCcPMNJ26rZ/W9gVQQwC
XXQCbSNQ5CIqEBdv/hy9fHEccHHKySuAS/B3lYHO2/
OkqmSyZ0U10w9EDrq4QdHh/Bz7dJTsVMpw21r2W0wz
4IORBhH0zrEdLkdaXw5Msss3SjXRE2HUGs0UJm`"#E
C *
`QrVkbNPmuIYKDPhm1SWHp8YTqgqhDGrbamriSASMf
fJ6//nBdmSpU0GARh9sqxj4RmtVgTu01FQizvc/mAk
7/wWY0EQDyR0NEVdwA1iGPyX1UVLhwtcxFvEbpFA1l
um6vDJcN11oUnFMoMSqaq1qrBItLGK2SaUyvq3m6aa
19mjQcyJDBaoVlx8jjnRzO9DrvmrtQ/U/RnsupGs6V
mD4KoDBTQgW/L9HB48mRwdHR8cv/3LwYoxeMef`"#E
C *
`AOrImXCeaiMI89MMtqOd4OoVuQFW8zshi7+KKzZI8
TWbKNQbDZa66kT3X1mQDfhvWm4MtisVyEbB2WuJMo3
QrbYK93tBcL3zg17BYgBBHPx0cRwOPmfakxBI1Kvsu
ra8elQk0tU4BkCwqzJSTizRPZiAxIZgx7ePYJOQwlZ
/dVDXM1vkE1JqUfKBar9JqSGBHCDYef4tyTalYbllt
jHe2trw0MLpxlpTgbzw+er5L3DiiLOojmi5pcP`"#E
C *
`gVDU5zlhc1i2Fqj/09SzLwWkr26vXL777dBCQ0bwA
NeWs1AZ2TrjWfNhYyTO65jgqNKpr4W8OCbPD80rTif
L1DaOxuBLm2noaEYVVOVW/rbvSg6pssGV6nVXqeZml
9g/7IVTqDLrIGnKr5vJjdDHGXMJ+JpYb5pa46MKjXl
d9bg19Nm5YhV7AR82qvT+13rvD+JFyzFyhccBo/jbW
ARH0liCM1JD1ATH+0rOpi/hjEibKSHN3on18fP`"#E
C *
`irmiyLHTnbR9gYsmpxncf4WBmt0laSXV/V4e2tr8C
6d1Vc4AAZlUqX/icI7yJKLGpO+3RlUIDtJ/ov4VReL
8ZZI+9t4S0qRpTpE4y5ABCol1/7iXGunBZZU+Oxzss
xxdXUCQ32WyS3P0chZauPzlF32PAVrm18yXojR2gVL
c7HWVg3ZK74OB7xdZjMavDfgL58nWCitigxGzWxoNh
EUuhqP9l4Qbp+hDhHNB06RpyF+Vkl2YedqZ2pW`"#E
C *
`4AY5oTCg3fyepQvuWrdlerF2b7Es4kwC6TDUJ84T7
LFc5BwOelbauW/B0N1a+iRcwTlMIsvErya5rnlNNDZ
/zqv4OpmhbD+kAj/z+hBKVfmdrFL2h9B7ME99g6wUT
R+wAuY+5dG0TBd1Jdy6AfTsfsbtAS3Pk6GCVPi6NWA
w3+TwovBTABwwvpb/skwv03zAsrhCw23X/w70W9LlF
KguED+pC0z54R+Bh0m4PRdAtUfgWcQlsNQDc4R`"#E
C *
`Ta+xAQ73C8FEN1TW1LwWDAoE+FDsMYXSa6Qp7A66K
IKNeCJWxLGNidZZkvGJilJhFTtIzrH+/BsV9vqyTbg
et8Wb+7nzKJexxUi1QupKyI7xgtK24msTCNfgMFu5J
A/A5QL7FvULQM1fQq+giFMPhMFzgNpAcSiMf0KQjIG
f8oyS7xTVo6wsTxRBtJKrsOnlfj36Nr2NRcmXByuyD
qLEP0Epx/jdgHI2apJ4y4Y85ZoFUMdiGWcG36Y`"#E
C *
`ZgWepiWmRoUUcjtKMeyFVR+aNNVqGN2jdNQuhTEX3
dxCJA2CzJhloZr1QrAa6nOahgjE9CErqGhhc2wtPWH
a6nO5Y54Av1MCbFkLS2LPlgnCXny8vLpNzjeTjqFsD
E5zAHAtdVo+183QF1Djr8tgempIkn2kH8DC2cc5o6r
iki+3oNdhdkk7gtiQZWr8GB9Rq+suUrtBrp04u0rGr
yq9ukQMOnOfgLNTer3ZChMzHes0c0LtPtV5U1D`"#E
C *
`ee11J0Ycd1km7uRRq79q6nPI9Hnnvvh9bl0h3qs4h
vAxbLu3sszGoD3D3/sHdpb0y3uJju8PdQInFWyOkX/
FSfAUC8M9yx+n8wY9wS//GKFTxzeCiAk1mY3ajexuW
5pPNrVUe4c/gK/g0y5zB1WC5j9daNh1NOABCTnPLqY
GBwaDpRXAm7MlOwH92givZ4x+nv3dPb76bDX//fRsM
bdA1lpT4VG6WUAWnoy66WwCQ8MWzuP3xMLoNYd`"#E
C *
`XViReWKi2WTbtJUTQf+rcn3AHa71wVhBBSq3Zkee1
28wqsrSadLd7g1/LdKcmOss1xhIG1cKBKT09ZjcFLG
EYC8gaPeSMiPml69s4tYibu1SzRfgbh+T/dsFVnIJK
M7zw5n+iTryIQyfVzGozWqXe+iUA6XMDFkAZqlFdg0
TtOcw5dXJ3Mwep3VmJM4FCDAgPCaq5fkc5DgHOHNgX
FCcW+NqNw9v1oFMsp+waJHNJtdxtqRw5AuKPBN`"#E
C *
`2CT2/zrRYpEkHoRiH2kVh0qig39KsGtCWjQZic5jv
w7QUGw9TZbE2yIOG5idRFS/Ih9qEDoXsm0laJ/PozA
kfmgOH0hzJ3sYYl0CAM65rlHUWsR8FewB2CP9Ntoe8
8LPkoma7DZmvcUnB3grSVe7ctcqdtip3mqsEN7SAzi
kuLioz9irOpkuczU+s/MZosghryWIQlqsFGoHe8Maq
RWVN6uLyMkNN1l0bGTYaxbwtPs0tM5yCb1q9oB`"#E
C *
`guubDOq56I5TdCu7l9F6R3IiA8d1tmkGXsDfzIol8
ihmPO7hZTMvnAaBTbIcm8tW5sii60cgtX3UzZkml25
8tUt7MMejHbrL0xAgPbMBOnDzatpU7MwYXrsprCyMT
8iZcPIxmjtP6KDfNaj8rHa7VoeBNt7jaIxV6wU53ND
qqb35Zp+bbaRDX4P78ZfgdmLUuuk2ybYZ0weaUtiRh
X3Dkac0/DS3HrEB+zb/omJ/qenuAl22GQ1r2WW`"#E
C *
`qkT+lbvt2LcWaPWnXVrteRrDXiz39cAdwXVLLJ6xK
B7ZiQHV8qbJQ8dEcUEy2MZjUjEy0xpU4yoBhInkIYG
SI/00UipE+1QgrsHJQFWgaFZFJY3uO/x3hh7lgnFxS
RlX1HApUE0bKW1Svp+KBx+pTU7P+fVIpmmF2kyo3Ue
Crm3VkevyuIdS977DAwvTVvcgO9WOKl2DDgDI6EbjH
Utik9PhGoNR3ORpTfBcHZJzW1UWFgdSFZgZ8BD`"#E
C *
`xGO0+ixq2ksIV01FjH1WU854Y6lczHnVx11dHIZSD
oSfCr/F4YPu1gB/8AZBpzTuBSTvwR3N48z03nBR91m
av30E4zOwlSPmg7IkcwLx3GzDQIcRDDMYRKmJxuC+N
XpE76OCwVEgdzhdCyGHy4TvKxmSYkjzNS3Y1WX2l+T
Gi/UTNeyYpdwgCBmUh+4uTHIV7Q4qmhcBzFAfRjA/P
q0COBzO8IF5GFQFyzz9bUkhRKGd/VBVUVZtand`"#E
C *
`5dzSK+jYmb9/f3fi3du4FiaPRu4RVywXMRhIGX6/i
64TFjNdqFQ83vonp1LVcVMIiZBakhKFoXNJ1ahrgrI
Z6mX/z/zP3Vc3ttj1LfzmDCfDzfZmJqpiPJ/x7OBuw
sihq/Jc8h8OZqd2mMUziM2NjgVmDDo/EuCPNyLLiew
FKEhY58xZQFPsY1wn1OMXA/Szz3WkB1iReDNGk7RY5
X916IRqDjAmkWZqSJAfnpCRIl/76NIfYTMENVh`"#E
C *
`weiL0ke1mH1DopftxM2oN/Hij6paoGLmxwzkG+G7R
rsE+WA4VL/DkviiyJ88gbKqobxBfwaY2yQdE0dTWF5
QkUoiuNnmrkSZlt4nFcCu6xg3tXlggbLdUMK8hj1dG
ItcISKQiNkn2vnpsqcfCkKqeu1kWbpKZcf8KzY66pZ
dLeaVuGB+m2BswtGw64Zkzv1HpLjazrVaZp5XWibf0
T2tbVnLfqx4XJoPW2JcKJMOEhnsm8sgOpsYxQE`"#E
C *
`XSCirz5jiPcolhTN0oV0zDXfHYYufQy90jex9fy+P
CvoWpCI5tqkh6bP5YlpyigESCdwehwjCbc2zSCaLYX
mPAvysChad1oXUTUaOAQx326I8AxurStBfMdhSYKqi
T7aAoAR4ACJvdHm9XVGn3LjVVT1+5H7Zr64/uT2txu
QbCv1zA0Hn9dr5J/0OhN4P9iVXa4XMxwlQtSLspiTh
cmTDLwi7nP5zloXlSO3Z18cR6nsEbPYpQkQ0HY`"#E
C *
`c9VSozwHdabszpOUlttbKkO5d0lfp+5QldiJdZm0W
RMqjTCehIqaMK/BYRWLg9OrHKbx4HC8pNXwdRfZ/Oo
kSpjYH1YH8wVF3FkG0gVdZrjbRVBJ0jAQfn7WUJcaF
b/yUfErjAqOUA2LXwPnjCwCxBDhxU5+PQtWxNr1DPX
lVpOqCWJJec8vs4k0hYdNswpdGAvykMZZWoF+onjGc
/C83/rxw9bH7hDD/22jUxAqVzPMdUgYJY7YmLo`"#E
C *
`U4yycxV5w8hrQYbjh2vh4W31t439EvB4vpmTWi2F3
Pl7QtfVZYzB25GDsrGewgx8l1m+5WL8FsabhIYX6bZ
tQW+QK6cbSJ28bZVt97mlMw7g+2sIGP57ZDX7aO7Il
tyWrKaLf+IRHaF7knkVYp85gejCRDIo5xrnWveu4am
zdnUaTT2HLkgZb7UhZF4OIqWh4dQAHH4aaW2EDH7E7
ClOjp3yNumkTyN4JwTJ0qFOX0ihEEEJn2DFqQM`"#E
C *
`WvgTsdO0fuwJjpgPDFm4ePjFSLSpkYchhN0hr8RlI
AIgTcFAabThOR6Va2zHIAr8GKpmVguzW4MzTsNDn+N
mA7Sfyv0zVGm2TfbMq++Uj2jdm3Pv9kb67kHsey4fe
C7HuxZeYVNPKDldyKQ9Ir91WMLaC1dnJExS0lbGBBW
Agex68BHP0SBTZ57rIl87l2VrxDu/VkWhRv00Qc+ac
W4Mn/m2rAFnF9ZSql5P0iLZOKLgYwliI3ENq8v`"#E
C *
`wV+MhXHw+vHEthN6tKPPZUsV2S69ENdBdLvIp6vd7
79+s9b+P/tra0tubgjCEFO78kf46hPCOrip+fHR3x5
yDzCZTaGMWqbXjDW8aqQTMFXcwoaGw372L+jlJzBaB
SZbeIRSvVVWDGICoBA/Ma3fappvEiojCUAOlCYukLE
K/UjaJIowjeD+qKpfcTQj/aazt9c2r1qdqGSUNGSXE
4Ax5FjDR4RAmshgOOUamdvpdoRKBrUjrALj2Sb`"#E
C *
`zSKmhqGYf1LEPHM4vYrL/bq7RfLfYR1P3SiUuoxeM
tweGMmcssBSlFD9AkwOP3nTgh+5oJSEV59xD0Nbzcx
1KQJuxDK3xKGh92dJltSJPaxN4Q+P/CgabG4LwL2mX
UFxoeOcX02CDPq5zOg4B+TImjCUzBQ5njsgUSMV/Sp
Oy7nzG5RKOqDNTPiSL5b1gP22TMqbI7EvE3s7H7pS9
6yYzrFPh6keG40o9mtRJnhBZOfN4eMOBmosq2S`"#E
C *
`GJ5cwD8/+SHCjprGA7uv7i7zbi8yjVyqwz7gKs6vx
qUBd80QcMdA7IsyTg/EpHJ9WZnTkraVvZKU6zFjH9c
Yt5xZi65xALKMOeE1WjrqVS9du5dNkA7WQPuS4y2fd
e2IGsovTDytwu/m4Y2yTNc1SdKYbi/JrfoyiGlBcvt
fEAMy2eGBuvgcYQdntvCCQeVJfFXTtBJ7zXavNFARh
QBqDBePkOCkygvjHqHeyfUYWLOrJxD/R0SKeaC`"#E
C *
`CyRyXgMjDLol+5TJBhFnbh5gNEMihYw2LEg3sZR16
nuXvWxyolDKWNRdA4dg+1kFZpO7CL+cFCznEaHKd0v
lMsE60ugURCiVniRX1Y5Kvu6K2Bk0zAOki3G5By2TV
PDWMtJpAR7o+R+MwvbnizqpA+mL/OAJRyLFWS7zXzY
dN+1DW86c4VgYip6WmDpMIYGN6cJfJX7SjIcSJw8O3
2NXBwwCCOZZnx25ZX0qH3gR0UpILFpwkFwvglg`"#E
C *
`a3CKGHJLtflaHPEAebej3wxZlctvLoG2I/3WRXws3
bETyieoYuBCT15bkRfYmD5kzkP0DEuC7MDVyg8yA1i
aYt40mzyr35T/bfBTzHYlMTXkxg0jB1lRKH8tAczWW
Z+1kTQLztSb9e43jCHNFmqU+ibKGuFHVXvUho1HAD/
4JKaG5k0jaF9uH2x6y2JiTMZknyn2ebHbOQkHLpEzA
wtjHICcMk5TIFmbQsBdMGLqJgDir0yGAd++k5D`"#E
C *
`urFv1LTKaHR0c0NZcIHRigU2vksxMDvSEgJrmtIYY
ySkaKCV1UD3y0ARzscUv0nEbKR1ekOh8I9X6SuBtUp
Rt2Z8sAcZuqYCxkPpXlTRWn+D0ge1EC+zWrrb8tZ6v
rT6b2r8kYOtBx/FWaE5ekpXNtAs1sl5gzc4iAyeZcT
6CTVGu0QEyGem+XJ+TgedNVdHoxdFvnl4oBLsaukC6
UMw4SZGkfs12xp+/50xYbToCpbkmXZBo7+MY1L`"#E
C *
`8i/CFUJs0ZqJ7TVfqIGrr+v0gHCe+Z/Pg8ID9uY8z
rU5Vx/ksLmcYJT8Hxy2G2jH8rrOKQWtVuy7P1mqrw0
b+j5AlXEAR133QLSIGzX0WLd5LQTPAxZ0gCpxX0git
7g0Z3yRVCICHzZ9Dk0wI/ldfTw7gDasG5siE2QO/Bv
BwNpiBG/46wbj+/cWCX6TkLiSoM2lDOneGI0vcuIRv
RBg+R1ZM/SU3nj0a7VesKoCcuMLg0MuiZiVoYp`"#E
C *
`zovzuffjPcEue1+KV7h4/5ca28AKQ5XpN6njDuzMI
cvi4I9ufXz+jkP1NrTf8b5zL8JKY6md7Hc+l9TMEzk
PRFLgL2ox+t9eYx1CB49JXKUJppHPUNxvFmGXWqy3g
nUHTC+6Ir83st4ObDHFYB1TJPo/FV2eae+zemy6xQn
P6ahr8IRBTJYE29yBASM7/9ME+9w8aXf8O53PqyTur
xgRudoSrzEtui+jlB/HozXWas3TQN0IDXXSFWY`"#E
C *
`OBWXy7xXLRNlU6+C12yVDtlLu5G2vgFamIpxiHQyb
sLlVbRdlKDtTTSi8cZbSop5S60QYF2igyMjXSAmpm7
HSrS7kILFWmnxsIqHSbjzn57P4rCdN+7A8DOuguBZs
l2OkN1OOQKc6SWy5r0hKX4YLIlnEnt85oAwZVRFTJM
x2gUeWa59ru9TEhLFeqTNQ0NoHPcgcvvjU33jwu5Ds
ZbG04pL8wh8NyUF0PuAjTubzuvD7CGJwT8Y2ky`"#E
C *
`WMYjxZwg6QWjYB1VOR275a3i3n5JeOsC9zvAh5p18
c+EX8LO9z8m7h4ZQlBc+YC9vyr5RgWuBCSzDP4VjeI
zK9GbWIKN/d03s4I9w4TaWzQ+lHm9t0Bu9x2mNVzub
Z+BE92HWx7yKrOH+4/+It9IALkGzykBJi2rK3HkXeE
IWmzXJboUfNWjSzFY7HmKX/ZJgQ3hBf6vo5cvbGkzM
uyVHDtvSN47My6iRI0TOmUlxgNlu1tFG5hqCb4`"#E
C *
`Y2IG7aUXORnd08vfB7ofb05PTs63N74enm/2DOLnI
8nJzyU7z0/K0PhO3ahB2FTIWdU9Ph7+f/D06PT3rfR
1h+Fin0+vREfEEFGW308WdJSwE/3R6nV6LoMMHhJM1
3h0KmeLu0Fcvj/DyUJJn575QBKKrMemuXpUsxLmr+d
xFSPAHQTlWyTFysmeoe4SPjJAQZq4BM9Nw3leoxSWh
B69fv3zNDl+wgyOYAbw+OH59ePDX/Wdsk+0/e/`"#E
C *
`byDXv08uVfDg+OjJg8V3XYQ6PpfkSzw13brwSarxK
dVwtjbchQDoirixv46awf9TRWrkcgd3TaPTl9Nz7tn
47O+qe90WV4GcRBuYdchw7YrGjGgegDqC0oqOX069P
Ns76qgv7SbYA+A7xLhqX8CuyWBtTX8PQ+yD7CrjGJx
ts2ktkG3snq1Gt1i2eOPke94Rv3xBV5UpxBzpecBto
iU1E99y+8dlsazZeIYsQIpglXLTwBRg/eBCaHC`"#E
C *
`l5Vf1W8G12ls4Qt86ooa5gPY5AlP5ufJxiVgpNju7
xccVY2UIZC8yMPGIxrwXM5EmvRGzbwMK0mdooeyE1o
ZVF3rVMPu/XrCIE70a20Ogd+nhM60l6IdSjg1Arts7
liBQ53UPsa4W5+eOGq6ojCdWubZkWVuNF1DaukhjB1
L4oM5ILWhmWydf6U57cfsVA4jBhRRN5eSldnOLS8lN
dffnc1QHqdpOhv7BzOKrt3GrHbfdKA3OyL9i7Q`"#E
C *
`Uck4bPHkgfJEVQJGFqjvzi6eipNecQbGO//yKc7QG
I9arCguoMyCgPGZRHhMzLgLCYJ/DsJH2AljvQjWNdk
TOB0AvTkRZyh/GOtpo8TUBwdWQjiBf+ti3lmJeccLK
bzLGRV0m7RwbPCLwhNzV7QFmxNIr6Ta3q23ClzV84y
WijV0mBMIrHuLSvRl67W/EpIBG0eo1x0CtAjaReW8O
VS5MeYp0s9iIf4yfLp1OOhez76KhaQh7sZDXuT`"#E
C *
`TMdEhYRUXg9XboW5V+p88CC6k8JpuByvEIDdtDiJi
Yy3D73fZlrra8AZ+8Mq12RBTPIVrYzw2YgRwkMgsyL
HeJcGqhnhd4YqL02T5Iade3JjmpNpXpRFqNBoO1HGx
CKwkIfRq1hGH78Upl1dr71m6W5aKYx6GPQvkxgHh+2
HB4de2EbnW3txqOLEPaTbrDruQqs3rUOOzYS3a2jmD
esTelxWaJbwZa2T6O7DU9O+G31Fr4zo9z5Lmhr`"#E
C *
`rVtLTOq/S+Yr4oKhW2xdxF3+AI9e/mDOCcZHWp8Db
7fi0IoCofwcq2WPUagxeynLEr4364biQlA71qjWgbB
HQJQZgKUczKBKARTcSLvOJxQUacRVEN6eJVv/Y9E+b
GhwmrMgBep4stbhps4ahf25EYtPLS3g67XAhY/ODDZ
dNFSOzuOwW5ajQbGe45s/LP32VN3GDy2S0nruqzs8Y
UI6Oyj5Yf8/Lb8+dxmvO9hsPqME/xvSKmDuoHr`"#E
C *
`mK2rKVWIGE83h0s4dW/O27VeI9GcarUxlBQ6W80nt
O+KgBtlZTX6TSZzOPFive3LcgmUgwgm57Wl8Atl7IZ
uXfqdk3U280oIVvB3Annzho4dzqOXtfiB9lyzFPtuw
oXvwFZDXlcOzB+ztP8JQk7BfzAHGKXfa8yzy9fFdUu
+/OfFbS6kNdEoS/iFS7d7UDSsfMRdLhk7OzclQx56X
Nw7BFb4T+82Wxu3P58T1uukZJBNRGvacwNDGh7`"#E
C *
`ghiaztPRStAkzS8KemYaMhbb9Hen9+UXVB0drxtze
5Ve0MPQ02WJyvUIy8opx/XYzTkhZHz/hNogNIH00aF
63Jde1snMwdQAQBRG/D7hV4A7KesbOhDQ5QTrmq7HK
gjumicLhl03WPCWTjB6V8wxeLL76pwzBAHFCaE5G4r
rFefO8q9Y3WlfHyIUzhl1eo2IT9qb72jBRfpVd2EhQ
jlstE+CqWBM5Eh5wS/9Nu4p0d6MXzh0aJJobjk`"#E
C *
`tmaWcBwRnHpGkQ5s8j2Ca72birwnpUtUiznnBuLnc
0av9F7wokx/bszCaJxCaPoKqkB7WsAs8CEiBq6jsRX
qvxtUIzDV0SR9f2X0nQkEdpJtSQTkjXxQeRGDRZml+
id0eqV+b+KRb1OuvVZTUqFG2pN89vPC1s3gfOCYfr6
TaKckl4S4l3NxxWP8R4vvwwC7YwAG5VnEnVWJZFU+j
jNm2Dngxc/Xt9w/GeoADqDesZYC8e/GDvPXAGr`"#E
C *
`t411boWpI2Avpu5+zZxZ3jAx4qeWmaU8zXT+7FViZ
i5YI2MnLnLozsuxJ1V862VbTpIm+65KcVyT+c6+qLO
exCNHFAYc74qDYaMmabrdIlB7ppUI9oOXINs4rF5bI
tnhjp2NsuHM+2sE0G3ntbXWWlrBp2PmUNwt+y2G5hN
gxYWJut41m0a0ndRr5qdsRXc8OrvuYarqVsSL3hVWV
tAiAvLNMVwWT9Bz1WzamRxQYuaXi/ySW9/QkTh`"#E
C *
`VScd+5ssS1tPCxBCL1h2+GbJIESO2uVcGbJd1X2fK
h6inqn18C7VoXXgGz7nmzcpBsFvmFf+zXR1MzzCj4H
s+lXloS53SZbdsDonZu98ymbbTfi49p97yaFW/OHNM
YdMSvmcO40+L/zHI780f8Ok7h/zd3+NXf7J5m78S2N
8OTNGM+fc/bGSfi80zdTNX2++ZvPzJYJ3Jrcba3qY6
dwAss/nvW3Wu7vPY2Tu3NN8zghZ/+ayH3ERO6P`"#E
C *
`mXCJnvwcMy7Ss/+adX2KWRdn5X/ZmRcXsntOvcy2/
xNNv4xm/X8+BRM6OA9vkLZuorZvzFm7+WZQzfmvj3h
wwhGHeB4vWqyFHTqg1SYPfAnFa4UqcGdeVtVhpQs6c
pOHkuwp5euWfYD+mY9wW9fG7+JYp7obUd2Nrs4rTPU
FUIoKQy13XHeXWFMMW4pfyWtPvMoVghZRCBw+1nU9+
Zijx+tKAlXiCoGs+Y79z4vprpdovF5fgd/pcJs`"#E
C *
`rbSNC8MIcDedFOUtKNO3jpkABgXgQcdjjYkGOSCQT
NutisUkN0vdYdDXentGmzbFON30Ts9mGqDoMcnolJK
C8RFg2zUKOWDrFWiTSiAYKCuUd2K8LOS1pE6tWYUUY
37uGfBVd30aeEQulBdcs7BzjcOP6zThGs5TD8c7Ot6
b98mPUrIez9bVJUjpVFsdoUXg3wVbF7i3aDplN4u22
BkR8G9xHv5GQrGSjkYFusWCPvzCOVLR1em4Hwf`"#E
C *
`Ha78Z9s6pPy6Xvvg8x6bvvFY/Mqu/OpvMyzg/n8WX
i3pkmePhQ5rcxEJHg+tEkRUhn6GgMGyqsVQ0Sv/omQ
VVoWtdTB+L+rkh90ZGtfhfYlRtrpG4/PHBAzfsJHNB
GrOYZ+nC3FddJeZHhtXum9xkqsEqa+SNAn0BE2gn9x
fOT2+H/hvDxsi46psyvkpFUXoKile1VXE3UTWndngr
7NbrFEhnrWKctrRM+EAOrvTh7WQvhmsd1m8n/c`"#E
C *
`F+t1drP8pSSdh4EtxvA7EloG7ot1WARZqhX1KwIcL
n90hCM2WrFvAMWDWY/ZPfEHX6rXEflS7SaRbE2Di03
FsrBJkrNItp6JUd78MAEvkY7Waq5HIKELwhIc7yIGa
FUj31srDqidCLVmX1VvQbD+/IbXxi2MSKogc9Ub390
CDzRc78A+Lbgd0L7KUPfIX1IeWIZY8Ux6e2oFziHZf
WdPAvBr4wlgnPcrXO6MAjlhN/bzfbzPyI8X7Z7`"#E
C *
`Z7127/wR7d5Z0e4du92tZ1ecN70/4+GS0YjR+easu
CwuLhg+V4pV5glduxeXN2tIPBWll06hqz6YvBUHPXE
nDRQcs25hWg/fqpsWWg2k6gAeQGAEMbSe6l0RybhBm
1F6mdpCMl6NhK/QEhb3lvK7BEKwzxALwZrCIVh7vAO
7e8gDWxH1wO4b+MA+TQA7u2McBPtEoRCheu8WDXHb3
IR/+O4/a9j9lTs46ZqbxXJvKbQpvP4xIvPTGiT`"#E
C *
`ZvPO95+Hy73NvfmqzfaPwI2p1fq6x//9Hc/IPYdxd
+dT8eCdbvYPPbJ81vFnTtE3je5yhPR/XJXWOIqZqln
HkTK7C9fnrrk3LsryF614DZM3tGklr44SzRzEa6XtR
uVIXJ9wopToJO0Jn7VQ3eE8tN0e5M6yDo0f7rw4mxy
8n+AY0Xlpt+hjwk24UU8FN6DPIRL4kIaZ6csIvflLJ
Pt4Bqe+I7J6cRqdfnT44/eG0c9bDKyLtyhFSSI`"#E
C *
`STMac9KU5WJ+rsss5Xvy2Leq/Dj292vqKkeL5QKQ8
oJdMgP1DCpU447VDKn775fq8TqhOIYfoGTtaNB+xcs
kY00qfy5JxeJDpvkIuLNMugl+aTWVLHaVbhzcYSp33
LMH94i67a05f0if1V41L6C+iCY3qEay+ApDjPW0vTl
fbaRbcL12mdieuf/ZL84a9jBAlfrRvE1UKKgdCdWTl
vo6rL0SdzeiY1TCDmrUOZh66FRjfu18aEXgW/R`"#E
C *
`7YVCYA9LGY3r+R7Bcw0USYgKLAiuwYX5Lkwb9Fjfo
995N97XRXLElQqKCVoQWNbLSj9nqt1SZeysi1F2xYl
gpfYtyFaSWLDO4frNO2TELnilnT/SvL71nr3e81bWe
KU+Qh2hG88b2CFEltjeN63YhdXY1tdwJbxZw0rtyk+
+KKojPHaSAAuXiOorwE6v+iJPjkAdF8UmAtGF8sP1W
9+F3fzUmQzVYY4RPyOqyisFMPFvDvRYRqsZ8GM`"#E
C *
`T4PXRcanyI6/q97xoM0BwOo4HSux49uH9Eap+769w
iyf8r4PZt5VIdTk6bDoAX9fke795js71FfjTtRXzep
HHZbOvCTCrVKJSkj+4cGIUP5watyrJ/pdyUefXt0Me
vKBC1dp7YJ4lOYrW+3Neuwe8thoXN++NutXch6Rnt2
L6xgDp4jtM8l5P1lyX+ZwUjHro3vA0ANDc0yr7/5Ca
dhxM0xwg4fWCmEzlY2N291XOB+taA1/rBXO8VJ`"#E
C *
`aIOcGQHibJ/ygsH7Fjy/rYRb2cDUwfuzj+9oDNr95
nVwevF/Qg8t1VcOfdJ5k6TytTejquKq16yXfXA69tu
y+s6yGjR+domqCRoYeUMZg3q2tLfHi+863moAN49Wo
7KguyvjS2LU1yGaBZxi0DTK4VtlvYrrqwkYZqB2pPs
QblNfBbiME1t4L5wS6i+PdakbrvAQnc+wNvLR6Eb9w
IdRJDv16p8K7IaLZneQHukstg2Zzz+CCuXIiJZ`"#E
C *
`HR28iM/+hGp6e//4gXjeKjG1FqPu8kC/DHFYw6Ahv
54eu7jDLBB2Oc0aJ6iZcQTwv/LmlqlhlZ+uTMmgzpl
5IdUOepZI6uNsREQaIxVqsFbw4fj/Cin0Df1maHWn1
T22JSm7Ihh7vTta4pdKlHxgA96WC77ckK/tctiy+Pm
MbT7iaTO9BV5kJwaITqIr8Wae53lbpUycPtrDK3Ilf
bEO1Kw541rtZi0h6s0luWmm4VRVu5VO0KK4T2X`"#E
C *
`phITQ2CCt65ZyvwfudHGLjqZZlepnmcaSP3yS3YP4
EtcoehYput7fburqObBk2lNJZ2PqIoON4r7JwAbfZ+
c3sPfORQCnTAJx1QrVvZC+BUXCYTvjneNYQ+eT+13c
Z8Nvnl6WvjpZYuf4CR7KDLWzKQxcJmoxgT+LA2c97c
prQNsX5tWQ/vMTAEHZZxWiUH1wkYlAiGzO60mA+BK4
uirMEA7RqLF9D1j9MKnzJ9U5RvX5VFnUxFhv0K`"#E
C *
`EdNvg72fyqeEVvGPnjEVkQWLYrFcdH+j5zKNqDD5C
hA4wNXjtKRDO04gRgtjjCwcdT9lxXmcCTQN4U+6mkA
pPzpIgXs+Dae847zAJVo7LfKLtJxP5tWlfotrhpjGc
nnFFet18XVcEgUTfuNvlY6lMnVeIYOpYeerTp+gTAw
tr4vpx+FcIO8xQHMwTMsE4/SsfhcwwYBKMbgMoQA9B
o148ebho0ekMMCwxGjqrRRxRBjh36Q5nyE+5bN`"#E
C *
`u/QAwTGAW78Xrvjv0Xb3dO8AtdgSg5AqoTvJf1G8Y
nk7e3+TvaN2JkN2GT2V/PKyfxgSJzTMDdXi5rR3O1E
Zul7GxQ7vnwoeVfQDPyZmjwEN8MSY63NfXMTIuyvZw
GWBdzleZ3HJO7IzQ8KYLszF2uKJx6q7jT8NxE8XNuC
PR7qKTqEib51BUABiH8D6+KD0MGTmXVvVpKtB1aWvs
R/PT6mAKLjQgDiUicXR0J0SNeAGPdfFIZ0soQn`"#E
C *
`CC1NbkTzmJiNqnsXd0dTQ2pSNXPOVcXSX8CGzgIWd
hYJx9SL5ZsuIuomp5PschzhkXrZpxNJkOO7a+dWeIQ
gqeEYLn1eXjNAZkZmOw/IZ3OgHX+6oSH0RXL5qGDj8
TAXTErsKDajE0ugxTYwa8PXz5+G9Rj8Ktult20F/hH
f3kLBBYutHhk9f7zw8MBVmIw39JvV+DoT9f1lBDOsN
Ob217U1EUmXsXBpbxxyxXwNXx+SE+xoQVba1CS`"#E
C *
`oQ8pPMca8GfK9C8WEkwxcGgexQG19065A/YP7pKs1
m3MA/PmopBBKzYEtvk6YSBDdmeEdPbo1E7wY4yT2sp
LP7DbRF/XMoQ/EZgZE+eRM1joaWk84SVDmJl6mmfwJ
nQEdvBsxxyKUzjNx486SEUXoUQKT+M3TFkzqU74yFy
nEDfrfDMmFu+FOFvTQhc+JoCtJrYcLOKDfLtHI8Pbe
HYVxMYgfQcmiVv+BTl0+3VCuzpthwooYBjjqXB`"#E
C *
`heKZuE7arBE2t31zReV21iBtZyVpO22k7dyTtG/WI
O2blaR900baN3cg7dZ9n2OBh+Iq7i+guKmHmdE5wVJ
0bHR5cUEG7IN8lErEiQlCoPJd/aTzLK7jAZB2keBat
HZyqGG45/d8//jpEI/lFeaRIl7JSTo7Q5YBDmvYCt9
CYuXP+IqYAMsXrfiqZbEEo+g3cVgm8+I66XaiPr7wC
+ow0qSyr2kjy130Ee82MHZpNTOduUuORhP27JK`"#E
C *
`81obCVsOvi3RmGn/+6HgAM/6DvXHb6/awT0YjhhMO
dhFPoak3MPkC6wVlixymwDk+llWn5LGxuIY5UFzWm8
tFj4sCOmoTWdAMDdRH0wD9okyvQQMBhynXOFY8oQOS
NJmST39T8iKm0/00wTLAs4JO0EMRqzJKsd51F32/If
GfaJAzW1mHIAA5PdAdqUzaL9cQtF9+Rg+eE0kXaZZ0
7ezhrzAJ9gRCdXioWjHW9twGI3arvZjgNheh13`"#E
C *
`wh/KcDfCCc87jPFLLm58LtDSdKruN6WVGE+ZYTKiM
a6L4g3jb/FkX8fUOPFXxlbnXna9nCUyZKakzggJLoc
qge1xFiFdBu3Wgk0KYVi3Mm6MnA8y7jjIEWhsQqyS4
2jZGTXzI1pPxWc3wue5qIajhv6ZAloUY8ERQmzFBzf
Ai6pDNuqJCMsZ3MfLJoO0dwzZTjxt7TQRbh/sMVxqo
ul1P+7rijKnS3gQOdLuqGw3+m9eOAzhknU3Hw1`"#E
C *
`JBpFHU0L8rQGhQHIhtZTr31D1GTDbUXhMF/9C7uZZ
KjsJyChvj3kTGTtiqnknjIfQUV8JkYtfhrE+aelvq0
LUrom/C0qZYgqMuX51k6dVQ5IxNHR313jZ4lz5APkQ
F9n1Vz8dtnt/1QJWiMpMSNoPCCvAs2xKotWI9TojWh
giZ3wstK0HAUIdoheJdmGTtPYCzCF3xvNKWRRWommZ
E+rZhdXJUd28OEf8LLaGSBtHWJfq22v0EOXziW`"#E
C *
`JcREg/G2MkMOGpnBLR/1oe0LOmhu4gssf60kxez3I
DkaYA2SHh+ZZBm41yHNZSv2fxNH5ZkGqNQdQE0rfno
0DcyRkVXxIt0NKz1dkWHiuhEViVwPgqtUOUgVPvTDH
tG6zv4irSR2KXKGkzaU47QrCfgr32nZ/Y/hzhZ9trc
F6c+S6yTblb9e0d6ehI62h1vgRMC4QFcAFALYifQyR
x3N8DgTOP08hhQMEqSDzRE25vENWN90elwsdsn`"#E
C *
`dIBwn4gTUGDfAWJ5UYJLepPnLfD9L42pMgGe8/M/7
xyBYu9iEh2XxDgoOZIakzcgTSQrkFcyEwSDMCUb+kL
mHrzBiD5oWEU3ibMF4e8B+BlTjrQF7BegK0Bp4UxKS
SjTdijjZybOj/VeHIX5TV/JFm/8H`"#EC *

319
6
raise exception type cx_nwbc_stati
c_check

exporting

textid = cx_nwbc_static_check=
>cx_file_not_found.

endcase.
1
ev_last_modified = 'Tue, 29 Jan 2013 0
9:17:58 GMT'. "#EC NOTEXT

1
ev_last_modified = 'Mon, 08 Apr 2013 0
9:52:08 GMT'. "#EC NOTEXT

0120031469
41
0001232730
0003
31
LIMU
CINC
CL_LSAPI_MANAGER==============CCIMP

00012

LIMU
CINC
CL_LSAPI_MANAGER==============CCIMP

00015

36
1
\\\\\no_empty_blocks/////
1
\\\\\comments_not_ignored/////
1
\\\\\delta_normalized/////
3
\\\\\allowed/////
FORM
*
3
\\\\\allowed/////
FUNCTION
*
3
\\\\\allowed/////
MODULE
**
3
\\\\\allowed/////
REPORT
*
3
\\\\\allowed/////
PROGRAM
*
3
\\\\\allowed/////
FUNCTION-POOL
*
4
\\\\\allowed/////
CLASS
*
DEFINITION
4
\\\\\allowed/////
CLASS
*
IMPLEMENTATION
5
\\\\\forbidden/////
CLASS
*
DEFINITION
DEFERRED
5
\\\\\forbidden/////
CLASS
*
DEFINITION
LOAD
6
\\\\\forbidden/////
CLASS
*
DEFINITION
LOCAL
FRIENDS
3
\\\\\allowed/////
AT
LINE-SELECTION
3
\\\\\allowed/////
AT
USER-COMMAND
4
\\\\\allowed/////
AT
SELECTION-SCREEN
**
3
\\\\\allowed/////
AT
PF*
2
\\\\\allowed/////
INITIALIZATION
2
\\\\\allowed/////
START-OF-SELECTION
2
\\\\\allowed/////
END-OF-SELECTION
3
\\\\\allowed/////
TOP-OF-PAGE
**
2
\\\\\allowed/////
END-OF-PAGE
3
\\\\\allowed/////
GET
**
3
\\\\\forbidden/////
GET
BADI
3
\\\\\forbidden/////
GET
BIT
3
\\\\\forbidden/////
GET
CONNECTION
3
\\\\\forbidden/////
GET
CURSOR
3
\\\\\forbidden/////
GET
DATASET
3
\\\\\forbidden/////
GET
LOCALE
3
\\\\\forbidden/////
GET
PARAMETER
3
\\\\\forbidden/////
GET
PF-STATUS
3
\\\\\forbidden/////
GET
PROPERTY
3
\\\\\forbidden/////
GET
REFERENCE
3
\\\\\forbidden/////
GET
RUN
3
\\\\\forbidden/////
GET
TIME
2
3
CLASS
LC_LSAPI_SAPGUI_STANDALONE
IMPLEMENTATION
3
29
3
lv_window_title = title.

lv_window_features = window_attributes
.

1
MOVE mode TO lv_navigation_mode.

5
" in SAP GUI standalone case we need t
o ignore sap-force_sapgui flag

cl_nwbc=>read_query_parameter( EXPORTI
NG iv_name = if_lsapi=>mc_tr_force_sapgui
iv_delete = abap_true

CHANGIN
G cv_url = lv_location ct_post = lt_fiel
ds ).

MOVE mode TO lv_navigation_mode.

57
3
lv_tr_name = lv_tr.

LOOP AT lt_fields ASSIGNING <param>.

1
ls_gui_param-parid = <param>-nam
e.

2
CHECK <param>-name NE if_lsapi=>mc
_tr_force_sapgui.

ls_gui_param-parid = <param>-nam
e.
84
7
CALL FUNCTION 'ABAP4_CALL_TRANSACT
ION' STARTING NEW TASK 'TEST'

EXPORTING

tcode = lv_t
r_name

skip_screen = lv_s
kip_sel_screen

TABLES

spagpa_tab = lt_g
ui_param

EXCEPTIONS

3
call_transaction_denied = 1
tcode_invalid = 2

OTHERS = 3.

1
OTHERS.

3
CLASS
LC_LSAPI_SAPGUI_NWBC
IMPLEMENTATION
2
92
4
ENDMETHOD. "is_lscont
ext_supported

METHOD constructor.
3
DATA: clsid(80),

event_tab TYPE cntl_simp


le_events,

event_tab_line TYPE cntl_simp


le_event.

1
DATA: clsid(80).

144
3
lv_context_string = me->get_context(
).

cl_nwbc=>context_set_from_http_reque
st( context_string = lv_context_string ).

ELSE.

1
cl_nwbc=>initialize_client( version
= 'SAP GUI 7.20' sb_nwbc_navigate = abap_t
rue ).
1
cl_nwbc=>initialize_client( version
= 'SAP GUI 7.20' sb_nwbc_navigate = abap_t
rue nwbc_shell = cl_nwbc=>for_desktop ).

LIMU
CINC
CL_NWBC_HTTP==================CCIMP

00026

LIMU
CINC
CL_NWBC_HTTP==================CCIMP

00029

31
1
\\\\\no_empty_blocks/////
1
\\\\\comments_not_ignored/////
1
\\\\\delta_normalized/////
3
\\\\\allowed/////
FORM
*
3
\\\\\allowed/////
FUNCTION
*
3
\\\\\allowed/////
MODULE
**
3
\\\\\allowed/////
REPORT
*
3
\\\\\allowed/////
PROGRAM
*
3
\\\\\allowed/////
FUNCTION-POOL
*
3
\\\\\allowed/////
AT
LINE-SELECTION
3
\\\\\allowed/////
AT
USER-COMMAND
4
\\\\\allowed/////
AT
SELECTION-SCREEN
**
3
\\\\\allowed/////
AT
PF*
2
\\\\\allowed/////
INITIALIZATION
2
\\\\\allowed/////
START-OF-SELECTION
2
\\\\\allowed/////
END-OF-SELECTION
3
\\\\\allowed/////
TOP-OF-PAGE
**
2
\\\\\allowed/////
END-OF-PAGE
3
\\\\\allowed/////
GET
**
3
\\\\\forbidden/////
GET
BADI
3
\\\\\forbidden/////
GET
BIT
3
\\\\\forbidden/////
GET
CONNECTION
3
\\\\\forbidden/////
GET
CURSOR
3
\\\\\forbidden/////
GET
DATASET
3
\\\\\forbidden/////
GET
LOCALE
3
\\\\\forbidden/////
GET
PARAMETER
3
\\\\\forbidden/////
GET
PF-STATUS
3
\\\\\forbidden/////
GET
PROPERTY
3
\\\\\forbidden/////
GET
REFERENCE
3
\\\\\forbidden/////
GET
RUN
3
\\\\\forbidden/////
GET
TIME
1
0
2
411
3
ELSE.

DATA: lo_handler TYPE REF TO lcl_h


ttp_base_handler.

1
CREATE OBJECT lo_handler TYPE (lv_
class)

3
CREATE OBJECT lo_handler
TYPE

(lv_class)

604
3
ENDMETHOD. "construct
or

ENDCLASS. "lcl_http_ato
m_handler IMPLEMENTATION

105
*-----------------------------------------
-----------------------------*

* CLASS lcl_abap_codepage DEFINITION


*-----------------------------------------
-----------------------------*

* Fallback as CL_ABAP_CODEPAGE does not ex


ist in SAP_BASIS 700

*-----------------------------------------
-----------------------------*

CLASS lcl_abap_codepage DEFINITION FINAL.

PUBLIC SECTION.

CLASS-METHODS:

convert_to

IMPORTING
!source TYPE string

!codepage TYPE string D


EFAULT `UTF-8`

value(endian) TYPE abap_end


ian OPTIONAL

value(replacement) TYPE abap_rep


l DEFAULT '#'

value(ignore_cerr) TYPE abap_boo


l DEFAULT abap_false

RETURNING

value(result) TYPE xstring

RAISING

cx_parameter_invalid_range
cx_sy_codepage_converter_init

cx_sy_conversion_codepage

cx_parameter_invalid_type

sap_codepage

IMPORTING

!codepage TYPE string

RETURNING

value(sapcp) TYPE cpcodepage


RAISING

cx_parameter_invalid

ENDCLASS. "lcl_abap_cod
epage DEFINITION

*-----------------------------------------
-----------------------------*

* CLASS lcl_abap_codepage IMPLEMENTA


TION

*-----------------------------------------
-----------------------------*
*

*-----------------------------------------
-----------------------------*

CLASS lcl_abap_codepage IMPLEMENTATION.

METHOD convert_to.

* convert source to result using codepag


e

DATA: c2x TYPE REF TO cl_abap_conv_ou


t_ce,

scp TYPE abap_encod.

scp = sap_codepage( codepage ).

c2x = cl_abap_conv_out_ce=>create( enc


oding = scp
endian = endian replacement =
replacement

ignore_cerr = ignore_cerr ).

c2x->convert( EXPORTING data = sourc


e

IMPORTING buffer = resul


t ).

ENDMETHOD. "convert_t
o

"convert_to

METHOD sap_codepage.

IF codepage IS INITIAL.
* return current codepage

CALL FUNCTION 'SCP_GET_CODEPAGE_NUMB


ER'

EXPORTING

database_also = space

IMPORTING

appl_codepage = sapcp

EXCEPTIONS

OTHERS = 1.

IF sy-subrc <> 0.
CLEAR sapcp.

ENDIF.

ELSE.

* seach http codepages

DATA: name TYPE string. name = codep


age.

TRANSLATE name TO UPPER CASE.

CALL FUNCTION 'SCP_CODEPAGE_BY_EXTER


NAL_NAME'

EXPORTING
external_name = name

kind = 'H'

IMPORTING

sap_codepage = sapcp

EXCEPTIONS

not_found = 1

OTHERS = 2.

IF sy-subrc = 0. EXIT. ENDIF.

* seach java codepages


CALL FUNCTION 'SCP_CODEPAGE_BY_EXTER
NAL_NAME'

EXPORTING

external_name = name

kind = 'J'

IMPORTING

sap_codepage = sapcp

EXCEPTIONS

not_found = 1

OTHERS = 2.
IF sy-subrc = 0. EXIT. ENDIF.

IF codepage = 'UTF-16'.

* assume platform byte order

IF cl_abap_char_utilities=>endian
= 'L'.

sapcp = sap_codepage( `UTF-16LE`


).

ELSE.

sapcp = sap_codepage( `UTF-16BE`


).

ENDIF.
ELSE.

* raise exception, unknown codepage

RAISE EXCEPTION TYPE cx_parameter_


invalid_range

EXPORTING parameter = 'CODEP


AGE' value = codepage.

ENDIF.

ENDIF.

ENDMETHOD. "sap_codep
age

ENDCLASS. "lcl_abap_cod
epage IMPLEMENTATION
LIMU
CINC
CL_NWBC_SAPGUI_SHORTCUT=======CCAU

99997

LIMU
CINC
CL_NWBC_SAPGUI_SHORTCUT=======CCAU

00003

31
1
\\\\\no_empty_blocks/////
1
\\\\\comments_not_ignored/////
1
\\\\\delta_normalized/////
3
\\\\\allowed/////
FORM
*
3
\\\\\allowed/////
FUNCTION
*
3
\\\\\allowed/////
MODULE
**
3
\\\\\allowed/////
REPORT
*
3
\\\\\allowed/////
PROGRAM
*
3
\\\\\allowed/////
FUNCTION-POOL
*
3
\\\\\allowed/////
AT
LINE-SELECTION
3
\\\\\allowed/////
AT
USER-COMMAND
4
\\\\\allowed/////
AT
SELECTION-SCREEN
**
3
\\\\\allowed/////
AT
PF*
2
\\\\\allowed/////
INITIALIZATION
2
\\\\\allowed/////
START-OF-SELECTION
2
\\\\\allowed/////
END-OF-SELECTION
3
\\\\\allowed/////
TOP-OF-PAGE
**
2
\\\\\allowed/////
END-OF-PAGE
3
\\\\\allowed/////
GET
**
3
\\\\\forbidden/////
GET
BADI
3
\\\\\forbidden/////
GET
BIT
3
\\\\\forbidden/////
GET
CONNECTION
3
\\\\\forbidden/////
GET
CURSOR
3
\\\\\forbidden/////
GET
DATASET
3
\\\\\forbidden/////
GET
LOCALE
3
\\\\\forbidden/////
GET
PARAMETER
3
\\\\\forbidden/////
GET
PF-STATUS
3
\\\\\forbidden/////
GET
PROPERTY
3
\\\\\forbidden/////
GET
REFERENCE
3
\\\\\forbidden/////
GET
RUN
3
\\\\\forbidden/////
GET
TIME
1
0
1
1
0
0
68
*"* use this source file for your ABAP uni
t test classes

CLASS lc_sapgui_shortcut_test DEFINITION F


OR TESTING FINAL.

PRIVATE SECTION.

METHODS: setup.

METHODS: teardown.
METHODS: get_shortcut FOR TESTING.

ENDCLASS. "lc_sapgui_shortcut_test

*-----------------------------------------
-----------------------------*

* CLASS lc_sapgui_shortcut_test IMPL


EMENTATION

*-----------------------------------------
-----------------------------*

*
*-----------------------------------------
-----------------------------*

CLASS lc_sapgui_shortcut_test IMPLEMENTATI


ON.

METHOD setup.

ENDMETHOD. "setup

METHOD teardown.
ENDMETHOD. "teardown

METHOD get_shortcut.

DATA:

lo_shortcut TYPE REF TO cl_nwbc_sapg


ui_shortcut,

* lt_exp TYPE string_table,

lt_act TYPE string_table.


* CREATE OBJECT lo_shortcut

* EXPORTING

* iv_system_id = SY-SYSID

* iv_client_id = SY-MANDT

* iv_system_description =

* iv_application_server_name =

* iv_system_number =

* it_gateway_hosts =
* iv_message_server_name =

* iv_service_port =

* iv_logon_group =

* iv_sm59_destination =

* iv_report_name =

* iv_report_variant =

* iv_title =

* iv_system_command =
* iv_transaction_code =

* iv_skip_initial_screen = ABAP_FAL
SE

* it_parameters =

* iv_user_id = SY-UNAME

* iv_language = SY-LANGU

* iv_password =

* iv_trace_level = CL_NWBC_SAPGUI_S
HORTCUT=>SC_NO_TRACE

* iv_work_directory =

* iv_gui_size = CL_NWBC_SAPGUI_SHOR
TCUT=>SC_GUI_SIZE_NORMAL_WINDOW
* iv_reuse_existing_connection = AB
AP_TRUE

* .

CREATE OBJECT lo_shortcut EXPORTING iv


_transaction_code = 'se38'.

lo_shortcut->get_shortcut( IMPORTING e
t_shortcut = lt_act ).

cl_aunit_assert=>assert_not_initial( a
ct = lt_act msg = 'Basics SAPGUI shotcut g
eneration failed!').

ENDMETHOD. "get_Shortcut
ENDCLASS. "lc_sapgui_shortcut_test

LIMU
CINC
CL_NWBC_SAPGUI_SHORTCUT=======CCDEF

99997

LIMU
CINC
CL_NWBC_SAPGUI_SHORTCUT=======CCDEF

00003

36
1
\\\\\no_empty_blocks/////
1
\\\\\comments_not_ignored/////
1
\\\\\delta_normalized/////
3
\\\\\allowed/////
FORM
*
3
\\\\\allowed/////
FUNCTION
*
3
\\\\\allowed/////
MODULE
**
3
\\\\\allowed/////
REPORT
*
3
\\\\\allowed/////
PROGRAM
*
3
\\\\\allowed/////
FUNCTION-POOL
*
4
\\\\\allowed/////
CLASS
*
DEFINITION
4
\\\\\allowed/////
CLASS
*
IMPLEMENTATION
5
\\\\\forbidden/////
CLASS
*
DEFINITION
DEFERRED
5
\\\\\forbidden/////
CLASS
*
DEFINITION
LOAD
6
\\\\\forbidden/////
CLASS
*
DEFINITION
LOCAL
FRIENDS
3
\\\\\allowed/////
AT
LINE-SELECTION
3
\\\\\allowed/////
AT
USER-COMMAND
4
\\\\\allowed/////
AT
SELECTION-SCREEN
**
3
\\\\\allowed/////
AT
PF*
2
\\\\\allowed/////
INITIALIZATION
2
\\\\\allowed/////
START-OF-SELECTION
2
\\\\\allowed/////
END-OF-SELECTION
3
\\\\\allowed/////
TOP-OF-PAGE
**
2
\\\\\allowed/////
END-OF-PAGE
3
\\\\\allowed/////
GET
**
3
\\\\\forbidden/////
GET
BADI
3
\\\\\forbidden/////
GET
BIT
3
\\\\\forbidden/////
GET
CONNECTION
3
\\\\\forbidden/////
GET
CURSOR
3
\\\\\forbidden/////
GET
DATASET
3
\\\\\forbidden/////
GET
LOCALE
3
\\\\\forbidden/////
GET
PARAMETER
3
\\\\\forbidden/////
GET
PF-STATUS
3
\\\\\forbidden/////
GET
PROPERTY
3
\\\\\forbidden/////
GET
REFERENCE
3
\\\\\forbidden/////
GET
RUN
3
\\\\\forbidden/////
GET
TIME
0
LIMU
CINC
CL_NWBC_SAPGUI_SHORTCUT=======CCIMP

99997

LIMU
CINC
CL_NWBC_SAPGUI_SHORTCUT=======CCIMP

00003

36
1
\\\\\no_empty_blocks/////
1
\\\\\comments_not_ignored/////
1
\\\\\delta_normalized/////
3
\\\\\allowed/////
FORM
*
3
\\\\\allowed/////
FUNCTION
*
3
\\\\\allowed/////
MODULE
**
3
\\\\\allowed/////
REPORT
*
3
\\\\\allowed/////
PROGRAM
*
3
\\\\\allowed/////
FUNCTION-POOL
*
4
\\\\\allowed/////
CLASS
*
DEFINITION
4
\\\\\allowed/////
CLASS
*
IMPLEMENTATION
5
\\\\\forbidden/////
CLASS
*
DEFINITION
DEFERRED
5
\\\\\forbidden/////
CLASS
*
DEFINITION
LOAD
6
\\\\\forbidden/////
CLASS
*
DEFINITION
LOCAL
FRIENDS
3
\\\\\allowed/////
AT
LINE-SELECTION
3
\\\\\allowed/////
AT
USER-COMMAND
4
\\\\\allowed/////
AT
SELECTION-SCREEN
**
3
\\\\\allowed/////
AT
PF*
2
\\\\\allowed/////
INITIALIZATION
2
\\\\\allowed/////
START-OF-SELECTION
2
\\\\\allowed/////
END-OF-SELECTION
3
\\\\\allowed/////
TOP-OF-PAGE
**
2
\\\\\allowed/////
END-OF-PAGE
3
\\\\\allowed/////
GET
**
3
\\\\\forbidden/////
GET
BADI
3
\\\\\forbidden/////
GET
BIT
3
\\\\\forbidden/////
GET
CONNECTION
3
\\\\\forbidden/////
GET
CURSOR
3
\\\\\forbidden/////
GET
DATASET
3
\\\\\forbidden/////
GET
LOCALE
3
\\\\\forbidden/////
GET
PARAMETER
3
\\\\\forbidden/////
GET
PF-STATUS
3
\\\\\forbidden/////
GET
PROPERTY
3
\\\\\forbidden/////
GET
REFERENCE
3
\\\\\forbidden/////
GET
RUN
3
\\\\\forbidden/////
GET
TIME
0
LIMU
CINC
CL_NWBC_SAPGUI_SHORTCUT=======CCMAC

99997

LIMU
CINC
CL_NWBC_SAPGUI_SHORTCUT=======CCMAC

00003
36
1
\\\\\no_empty_blocks/////
1
\\\\\comments_not_ignored/////
1
\\\\\delta_normalized/////
3
\\\\\allowed/////
FORM
*
3
\\\\\allowed/////
FUNCTION
*
3
\\\\\allowed/////
MODULE
**
3
\\\\\allowed/////
REPORT
*
3
\\\\\allowed/////
PROGRAM
*
3
\\\\\allowed/////
FUNCTION-POOL
*
4
\\\\\allowed/////
CLASS
*
DEFINITION
4
\\\\\allowed/////
CLASS
*
IMPLEMENTATION
5
\\\\\forbidden/////
CLASS
*
DEFINITION
DEFERRED
5
\\\\\forbidden/////
CLASS
*
DEFINITION
LOAD
6
\\\\\forbidden/////
CLASS
*
DEFINITION
LOCAL
FRIENDS
3
\\\\\allowed/////
AT
LINE-SELECTION
3
\\\\\allowed/////
AT
USER-COMMAND
4
\\\\\allowed/////
AT
SELECTION-SCREEN
**
3
\\\\\allowed/////
AT
PF*
2
\\\\\allowed/////
INITIALIZATION
2
\\\\\allowed/////
START-OF-SELECTION
2
\\\\\allowed/////
END-OF-SELECTION
3
\\\\\allowed/////
TOP-OF-PAGE
**
2
\\\\\allowed/////
END-OF-PAGE
3
\\\\\allowed/////
GET
**
3
\\\\\forbidden/////
GET
BADI
3
\\\\\forbidden/////
GET
BIT
3
\\\\\forbidden/////
GET
CONNECTION
3
\\\\\forbidden/////
GET
CURSOR
3
\\\\\forbidden/////
GET
DATASET
3
\\\\\forbidden/////
GET
LOCALE
3
\\\\\forbidden/////
GET
PARAMETER
3
\\\\\forbidden/////
GET
PF-STATUS
3
\\\\\forbidden/////
GET
PROPERTY
3
\\\\\forbidden/////
GET
REFERENCE
3
\\\\\forbidden/////
GET
RUN
3
\\\\\forbidden/////
GET
TIME
0
LIMU
CINC
CL_URL========================CCAU

99997

LIMU
CINC
CL_URL========================CCAU

00003

31
1
\\\\\no_empty_blocks/////
1
\\\\\comments_ignored/////
1
\\\\\delta_normalized/////
3
\\\\\allowed/////
FORM
*
3
\\\\\allowed/////
FUNCTION
*
3
\\\\\allowed/////
MODULE
**
3
\\\\\allowed/////
REPORT
*
3
\\\\\allowed/////
PROGRAM
*
3
\\\\\allowed/////
FUNCTION-POOL
*
3
\\\\\allowed/////
AT
LINE-SELECTION
3
\\\\\allowed/////
AT
USER-COMMAND
4
\\\\\allowed/////
AT
SELECTION-SCREEN
**
3
\\\\\allowed/////
AT
PF*
2
\\\\\allowed/////
INITIALIZATION
2
\\\\\allowed/////
START-OF-SELECTION
2
\\\\\allowed/////
END-OF-SELECTION
3
\\\\\allowed/////
TOP-OF-PAGE
**
2
\\\\\allowed/////
END-OF-PAGE
3
\\\\\allowed/////
GET
**
3
\\\\\forbidden/////
GET
BADI
3
\\\\\forbidden/////
GET
BIT
3
\\\\\forbidden/////
GET
CONNECTION
3
\\\\\forbidden/////
GET
CURSOR
3
\\\\\forbidden/////
GET
DATASET
3
\\\\\forbidden/////
GET
LOCALE
3
\\\\\forbidden/////
GET
PARAMETER
3
\\\\\forbidden/////
GET
PF-STATUS
3
\\\\\forbidden/////
GET
PROPERTY
3
\\\\\forbidden/////
GET
REFERENCE
3
\\\\\forbidden/////
GET
RUN
3
\\\\\forbidden/////
GET
TIME
1
0
1
1
0
0
107

*-----------------------------------------
-----------------------------*

* CLASS lc_Url_Test DEFINITION


*-----------------------------------------
-----------------------------*

*-----------------------------------------
-----------------------------*

CLASS lc_url_test DEFINITION FOR TESTING F


INAL.

PRIVATE SECTION.

DATA: lo_url TYPE REF TO cl_url. "cla


ss under test

METHODS: setup.
METHODS: teardown.

METHODS: get_transaction_name FOR TEST


ING.

METHODS: get_wda_name FOR TESTING.

ENDCLASS. "lc_url_test

*-----------------------------------------
-----------------------------*
* CLASS lc_url_test IMPLEMENTATION

*-----------------------------------------
-----------------------------*

*-----------------------------------------
-----------------------------*

CLASS lc_url_test IMPLEMENTATION.

METHOD setup.

CREATE OBJECT lo_url.


ENDMETHOD. "setup

METHOD teardown.

ENDMETHOD. "teardown

METHOD get_transaction_name.

DATA: ev_name TYPE string,

ev_skip_sel_screen TYPE abap_boo


l,
et_parameters TYPE tihttpnv
p,

lt_parameters LIKE et_param


eters.

FIELD-SYMBOLS: <param> LIKE LINE OF


lt_parameters.

""""""""""""""""""""""""""""""""""""""
""""""""""""""""""""""""""

" test transaction exctraction with sk


ip selection scring, parameters and encodi
ng

cl_url=>get_transaction_name( EXPORTIN
G iv_url = 'https://ldciq7k.wdf.sap.corp:4
4304/sap/bc/gui/sap/its/webgui;~sysid=Q7K;
~service=3204?~transaction=*ICLCDC02+PAR1%
3D%C3%84R%3B%2FPAR2%2FX%3D%C3%9C%3BDYNP_OK
CODE%3Ddo-it'
IMPORTIN
G ev_name = ev_name ev_skip_sel_screen = e
v_skip_sel_screen et_parameters = et_param
eters ).

cl_aunit_assert=>assert_equals( act =
ev_name exp = 'ICLCDC02' msg = 'Transactio
n name is wrong!' ).

cl_aunit_assert=>assert_equals( act =
ev_skip_sel_screen exp = abap_true msg = '
Skip Selection Screen is not recognized' )
.

CLEAR lt_parameters.

APPEND INITIAL LINE TO lt_parameters A


SSIGNING <param>.

<param>-name = 'PAR1'. <param>-value =


'R'. "#EC STRING_OK

APPEND INITIAL LINE TO lt_parameters A


SSIGNING <param>.
<param>-name = '/PAR2/X'. <param>-valu
e = ''. "#EC STRING_OK

APPEND INITIAL LINE TO lt_parameters A


SSIGNING <param>.

<param>-name = 'DYNP_OKCODE'. <param>-


value = 'do-it'.

cl_aunit_assert=>assert_equals( act =
et_parameters exp = lt_parameters msg = 'T
ransaction paramaters parsed incorrectly')
.

""""""""""""""""""""""""""""""""""""""
""""""""""""""""""""""""""

" test transaction exctraction with ex


tra percentage encoding for skip selection
string and space

cl_url=>get_transaction_name( EXPORTIN
G iv_url = 'https://ldciq7k.wdf.sap.corp:4
4304/sap/bc/gui/sap/its/webgui;~sysid=Q7K;
~service=3204?~transaction=%2AICLCDC02%20P
AR1%3D%C3%84R%3B%2FPAR2%2FX%3D%C3%9C%3BDYN
P_OKCODE%3DDOIT'
IMPORTIN
G ev_name = ev_name ev_skip_sel_screen = e
v_skip_sel_screen et_parameters = et_param
eters ).

cl_aunit_assert=>assert_equals( act =
ev_name exp = 'ICLCDC02' msg = 'Transactio
n name is wrong!' ).

cl_aunit_assert=>assert_equals( act =
ev_skip_sel_screen exp = abap_true msg = '
Skip Selection Screen is not recognized' )
.

CLEAR lt_parameters.

APPEND INITIAL LINE TO lt_parameters A


SSIGNING <param>.

<param>-name = 'PAR1'. <param>-value =


'R'. "#EC STRING_OK

APPEND INITIAL LINE TO lt_parameters A


SSIGNING <param>.
<param>-name = '/PAR2/X'. <param>-valu
e = ''. "#EC STRING_OK

APPEND INITIAL LINE TO lt_parameters A


SSIGNING <param>.

<param>-name = 'DYNP_OKCODE'. <param>-


value = 'DOIT'.

cl_aunit_assert=>assert_equals( act =
et_parameters exp = lt_parameters msg = 'T
ransaction paramaters parsed incorrectly')
.

""""""""""""""""""""""""""""""""""""""
""""""""""""""""""""""""""

" test transaction exctraction with re


lative url and space percentage encoding

cl_url=>get_transaction_name( EXPORTIN
G iv_url = '/sap/bc/gui/sap/its/webgui;~sy
sid=Q7K?~transaction=ICLCDC02%20PAR1%3D%C3
%84R%3B%2FPAR2%2FX%3D%C3%9C%3B'

IMPORTIN
G ev_name = ev_name ev_skip_sel_screen = e
v_skip_sel_screen et_parameters = et_param
eters ).

cl_aunit_assert=>assert_equals( act =
ev_name exp = 'ICLCDC02' msg = 'Transactio
n name is wrong!' ).

cl_aunit_assert=>assert_equals( act =
ev_skip_sel_screen exp = abap_false msg =
'Skip Selection Screen is not recognized'
).

CLEAR lt_parameters.

APPEND INITIAL LINE TO lt_parameters A


SSIGNING <param>.

<param>-name = 'PAR1'. <param>-value =


'R'. "#EC STRING_OK

APPEND INITIAL LINE TO lt_parameters A


SSIGNING <param>.
<param>-name = '/PAR2/X'. <param>-valu
e = ''. "#EC STRING_OK

cl_aunit_assert=>assert_equals( act =
et_parameters exp = lt_parameters msg = 'T
ransaction paramaters parsed incorrectly')
.

ENDMETHOD. "get_transaction_name

METHOD get_wda_name.

DATA: rv_name TYPE string.


""""""""""""""""""""""""""""""""""""""
""""""""""""""""""""""""""

" test WDA exctraction with relative p


ath

rv_name = cl_url=>get_wda_name( iv_url


= '/sap/bc/webdynpro/SAP/FPM_WIRE_TEST_OV
P?sap-wd-configId=FPM_WIRE_TEST_OVP_APPCC&
sap-client=100&sap-language=EN' ).

cl_aunit_assert=>assert_equals( act =
rv_name exp = 'FPM_WIRE_TEST_OVP\FPM_WIRE_
TEST_OVP_APPCC' msg = 'WDA name/configurat
ion is wrong!' ).

ENDMETHOD. "get_wda_name
ENDCLASS. "lc_url_test

LIMU
METH
CL_LSAPI_MANAGER GET_INSTANCE

00014

LIMU
METH
CL_LSAPI_MANAGER GET_INSTANCE

00017

3
1
\\\\\no_empty_blocks/////
1
\\\\\comments_not_ignored/////
1
\\\\\delta_normalized/////
1
0
2
6
3
IF m_instance IS NOT BOUND.

DATA: retval TYPE sydebug,


2
retval_its TYPE sydebug,

ls_context TYPE cl_nwbc=>t_co


ntext.

1
ls_context TYPE cl_nwbc=>t_co
ntext.

11
3

CALL FUNCTION 'ICF_IS_PLUGIN_SESSION


'

IMPORTING

2
plugin_session = retval

its_plugin_session = retval_its.
1
plugin_session = retval.

LIMU
METH
CL_LSAPI_MANAGER NAVIGATE_TO_
TRANSACTION
00002

LIMU
METH
CL_LSAPI_MANAGER NAVIGATE_TO_
TRANSACTION
00005

3
1
\\\\\no_empty_blocks/////
1
\\\\\comments_not_ignored/////
1
\\\\\delta_normalized/////
1
0
1
22
4
ENDIF.

CONCATENATE if_lsapi=>gc_s_protocol-tran
saction lv_sm59_alias `~` lv_transaction I
NTO url.
1
IF url IS NOT REQUESTED.

8
IF force_sapgui IS SUPPLIED.

cl_nwbc=>replace_query_parameter( EXPO
RTING param_name = if_lsapi=>mc_tr_forc
e_sapgui

param_value = force_sapgui

param_default = abap_false

CHAN
GING url = url ).

ENDIF.
IF url IS NOT REQUESTED.

LIMU
METH
CL_NWBC INITIALIZE_C
LIENT
00009

LIMU
METH
CL_NWBC INITIALIZE_C
LIENT
00012

3
1
\\\\\no_empty_blocks/////
1
\\\\\comments_not_ignored/////
1
\\\\\delta_normalized/////
1
0
3
7
3
ls_context = context_get( ).

IF ls_context-valid EQ abap_false.
3

ls_context-valid = abap_true.

ls_context-nwbc_shell = cl_nwbc=>for_h
tml.

3
ev_already_initialized = abap_false.

ls_context-valid = abap_true.

ls_context-nwbc_shell = nwbc_shell.

32
3
IF sb_nwbc_tab_browsing IS SUPPLIED.

cl_lsapi_manager=>set_supported( EXP
ORTING feature = if_lsapi=>mc_feature_nwbc
_tab_browsing
set = sb_nwbc_tab_browsing

4
CHA
NGING support_bits = ls_context-support_bi
ts ).

ENDIF.

" when everything is updated, set sess


ion context

10
CHA
NGING support_bits = ls_context-support_bi
ts ).

ENDIF.
IF sb_nwbc_native_sapgui IS SUPPLIED.

cl_lsapi_manager=>set_supported( EXP
ORTING feature = if_lsapi=>mc_feature_nwbc
_native_sapgui

set = sb_nwbc_native_sapgui

CHA
NGING support_bits = ls_context-support_bi
ts ).

ENDIF.

" when everything is updated, set sess


ion context

39
3
context_set( is_context = ls_context )
.
ELSE.

1
RAISE already_initialized.

1
ev_already_initialized = abap_true.

LIMU
METH
CL_NWBC READ_QUERY_P
ARAMETER
00007

LIMU
METH
CL_NWBC READ_QUERY_P
ARAMETER
00010

3
1
\\\\\no_empty_blocks/////
1
\\\\\comments_not_ignored/////
1
\\\\\delta_normalized/////
1
0
2
5
4
METHOD read_query_parameter.
DATA: lv_query TYPE string,

lv_subrc LIKE sy-subrc,

2
lv_params TYPE string,

lt_fields TYPE tihttpnvp.

1
lt_fields TYPE tihttpnvp.

36
4
DELETE TABLE lt_fields WITH TABLE KE
Y name = iv_name.

ENDIF.
ENDIF.

3
IF cv_get IS SUPPLIED.

cv_get = cl_nwbc_utility=>fields_to_st
ring( lt_fields ).

ELSEIF cv_url IS SUPPLIED.

2
cv_get = cl_nwbc_utility=>fields_to_stri
ng( lt_fields ).

IF cv_url IS SUPPLIED.

LIMU
METH
CL_NWBC REPLACE_QUER
Y_PARAMETER
00005
LIMU
METH
CL_NWBC REPLACE_QUER
Y_PARAMETER
00008

3
1
\\\\\no_empty_blocks/////
1
\\\\\comments_not_ignored/////
1
\\\\\delta_normalized/////
1
0
1
28
3
<ff>-value = param_value.

ENDIF.

1
lv_params = cl_nwbc_utility=>fields_to_s
tring( lt_fields ).

6
IF param_default IS SUPPLIED AND param_v
alue EQ param_default.

DELETE TABLE post_body WITH TABLE KEY


name = param_name.

DELETE TABLE lt_fields WITH TABLE KEY


name = param_name.

ENDIF.

lv_params = cl_nwbc_utility=>fields_to_s
tring( lt_fields ).

LIMU
METH
CL_NWBC_HTML_BASE INITIALIZE

00011

LIMU
METH
CL_NWBC_HTML_BASE INITIALIZE

00014

3
1
\\\\\no_empty_blocks/////
1
\\\\\comments_not_ignored/////
1
\\\\\delta_normalized/////
1
0
1
14
4
cl_nwbc=>initialize_client(

exporting

version = lv_client_ve
rsion

sb_nwbc_obn = abap_true

3
sb_nwbc_navigate = abap_true

exceptions

already_initialized = 1 ).

1
sb_nwbc_navigate = abap_true ).
LIMU
METH
CL_NWBC_HTTP HANDLE_LAUNC
H
00032

LIMU
METH
CL_NWBC_HTTP HANDLE_LAUNC
H
00035

3
1
\\\\\no_empty_blocks/////
1
\\\\\comments_not_ignored/////
1
\\\\\delta_normalized/////
1
0
1
83
5
DATA:

lv_url_start TYPE string,

lv_url_end TYPE string.

SPLIT nwbc_url AT '?' INTO lv_url_star


t lv_url_end.

LOOP AT <cockpit_with_roles>-role_name
s ASSIGNING <role_name>.
2
DATA: agr_name_url TYPE string,

agr_name_url2 TYPE string.

1
DATA: agr_name_url TYPE string.

LIMU
METH
CL_NWBC_HTTP HANDLE_SAPGU
ILINK
99997

LIMU
METH
CL_NWBC_HTTP HANDLE_SAPGU
ILINK

00003

3
1
\\\\\no_empty_blocks/////
1
\\\\\comments_not_ignored/////
1
\\\\\delta_normalized/////
1
0
1
1
0
0
107
METHOD handle_sapguilink.
DATA: lv_p_transaction TYPE tcode,

lv_p_parameters TYPE string,

lv_p_destination TYPE rfcdest


,

lv_p_user TYPE string,

lt_p_parameters TYPE tihttpn


vp,

lv_p_skip_sel_screen TYPE abap_bo


ol,

lv_p_title TYPE string,

lv_p_language TYPE syst-la


ngu,

lv_p_report TYPE program


m,

lv_p_report_var TYPE raldb_v


ari,

lv_p_app_server TYPE rfcdisp


lay-rfchost,

lv_p_sys_number TYPE rfcdisp


lay-rfcservice,

lv_p_sys_id TYPE sy-sysi


d,

lv_p_client TYPE syst-ma


ndt,

lv_user LIKE sy-unam


e,

lv_xuser TYPE xstring


,
lr_conv TYPE REF TO
cl_abap_conv_in_ce,

lo_shortcut TYPE REF TO


cl_nwbc_sapgui_shortcut,

lv_shortcut TYPE string,

lv_shortcut_x TYPE xstring


,

lt_shortcut TYPE string_


table.

lv_p_transaction = mo_server_assist
->get_filtered_form_field( name = cl_nwbc_
sapgui_shortcut=>gc_s_url_param-transactio
n upper = abap_true ).

lv_p_destination = mo_server_assist
->get_filtered_form_field( name = cl_nwbc_
sapgui_shortcut=>gc_s_url_param-destinatio
n ).

lv_p_user = mo_server_assist
->get_filtered_form_field( name = cl_nwbc_
sapgui_shortcut=>gc_s_url_param-user ).

lv_p_client = mo_server_assist
->get_filtered_form_field( name = cl_nwbc_
sapgui_shortcut=>gc_s_url_param-client upp
er = abap_true default = sy-mandt ).

lv_p_title = mo_server_assist
->get_filtered_form_field( name = cl_nwbc_
sapgui_shortcut=>gc_s_url_param-title ).

lv_p_language = mo_server_assist
->get_filtered_form_field( name = cl_nwbc_
sapgui_shortcut=>gc_s_url_param-language u
pper = abap_true ).

lv_p_report = mo_server_assist
->get_filtered_form_field( name = cl_nwbc_
sapgui_shortcut=>gc_s_url_param-report upp
er = abap_true ).

lv_p_report_var = mo_server_assist
->get_filtered_form_field( name = cl_nwbc_
sapgui_shortcut=>gc_s_url_param-report_var
upper = abap_true ).

lv_p_app_server = mo_server_assist
->get_filtered_form_field( name = cl_nwbc_
sapgui_shortcut=>gc_s_url_param-app_server
).

lv_p_sys_number = mo_server_assist
->get_filtered_form_field( name = cl_nwbc_
sapgui_shortcut=>gc_s_url_param-sys_number
).

lv_p_sys_id = mo_server_assist
->get_filtered_form_field( name = cl_nwbc_
sapgui_shortcut=>gc_s_url_param-system_id
default = sy-sysid ).
lv_p_skip_sel_screen = mo_server_assist
->get_bool_form_field( name = cl_nwbc_sapg
ui_shortcut=>gc_s_url_param-skip_sel_scree
n ).

lv_p_parameters = mo_server_assist->ge
t_filtered_form_field( name = cl_nwbc_sapg
ui_shortcut=>gc_s_url_param-parameters ).

cl_nwbc_utility=>string_to_fields( EXPOR
TING iv_string = lv_p_parameters IMPORTING
et_fields = lt_p_parameters ).

lv_user = sy-uname.

IF lv_p_user IS NOT INITIAL.


" Decode User

CALL FUNCTION 'SCMS_BASE64_DECODE_STR'

EXPORTING

input = lv_p_user

IMPORTING

output = lv_xuser

EXCEPTIONS

failed = 1
OTHERS = 2.

IF sy-subrc IS INITIAL.

lr_conv = cl_abap_conv_in_ce=>create
( input = lv_xuser ).

lr_conv->read( IMPORTING data = lv_u


ser ).

ENDIF.

ENDIF.
IF lt_p_parameters IS NOT INITIAL.

lv_p_skip_sel_screen = abap_true.

ENDIF.

CREATE OBJECT lo_shortcut

EXPORTING

iv_transaction_code = lv_p_tr
ansaction

it_parameters = lt_p_pa
rameters

iv_user_id = lv_user
iv_title = lv_p_ti
tle

iv_client_id = lv_p_cl
ient

iv_language = lv_p_la
nguage

iv_report_name = lv_p_re
port

iv_report_variant = lv_p_re
port_var

iv_system_id = lv_p_sy
s_id

iv_application_server_name = lv_p_ap
p_server

iv_system_number = lv_p_sy
s_number
iv_skip_initial_screen = lv_p_sk
ip_sel_screen

iv_sm59_destination = lv_p_de
stination.

lo_shortcut->get_shortcut( IMPORTING et_


shortcut = lt_shortcut ).

CONCATENATE LINES OF lt_shortcut INTO lv


_shortcut SEPARATED BY crlf.

TRY.

CALL METHOD ('CL_ABAP_CODEPAGE')=>co


nvert_to
EXPORTING

SOURCE = lv_shortcut " So


urce String

codepage = 'ISO-8859-1' " Co


de Page Name

ignore_cerr = abap_true " Ig


nore Conversion Errors

RECEIVING

result = lv_shortcut_x.

CATCH cx_sy_dyn_call_error.

CALL METHOD lcl_abap_codepage=>conve


rt_to
EXPORTING

SOURCE = lv_shortcut " So


urce String

codepage = 'ISO-8859-1' " Co


de Page Name

ignore_cerr = abap_true " Ig


nore Conversion Errors

RECEIVING

result = lv_shortcut_x.

ENDTRY.

* Render HTTP response


mo_server_assist->set_response( iv_conte
nt = lv_shortcut_x iv_content_type = if_nw
bc_constants=>gc_s_file_type-sapshortcut )
.

ENDMETHOD.

LIMU
METH
CL_NWBC_SAPGUI_SHORTCUT ADD_HEADER

99997

LIMU
METH
CL_NWBC_SAPGUI_SHORTCUT ADD_HEADER

00003

3
1
\\\\\no_empty_blocks/////
1
\\\\\comments_not_ignored/////
1
\\\\\delta_normalized/////
1
0
1
1
0
0
7
METHOD add_header.
FIELD-SYMBOLS: <line> LIKE LINE OF data.

IF header IS NOT INITIAL.

APPEND INITIAL LINE TO data ASSIGNING


<line>.

CONCATENATE `[` header `]` INTO <line>


.

ENDIF.

ENDMETHOD.

LIMU
METH
CL_NWBC_SAPGUI_SHORTCUT ADD_OPTION

99997

LIMU
METH
CL_NWBC_SAPGUI_SHORTCUT ADD_OPTION

00003
3
1
\\\\\no_empty_blocks/////
1
\\\\\comments_not_ignored/////
1
\\\\\delta_normalized/////
1
0
1
1
0
0
7
METHOD add_option.

FIELD-SYMBOLS: <line> LIKE LINE OF data.

IF name IS NOT INITIAL AND value IS NOT


INITIAL.

APPEND INITIAL LINE TO data ASSIGNING


<line>.

CONCATENATE name `=` value INTO <line>


.

ENDIF.

ENDMETHOD.
LIMU
METH
CL_NWBC_SAPGUI_SHORTCUT ADD_URL_PARA
M
99997

LIMU
METH
CL_NWBC_SAPGUI_SHORTCUT ADD_URL_PARA
M
00003

3
1
\\\\\no_empty_blocks/////
1
\\\\\comments_not_ignored/////
1
\\\\\delta_normalized/////
1
0
1
1
0
0
11
METHOD add_url_param.

FIELD-SYMBOLS: <ff> LIKE LINE OF fields.


IF name IS NOT INITIAL AND value NE defa
ult.

APPEND INITIAL LINE TO fields ASSIGNIN


G <ff>.

<ff>-name = name.

<ff>-value = value.

ENDIF.

ENDMETHOD.

LIMU
METH
CL_NWBC_SAPGUI_SHORTCUT CONSTRUCTOR

99997

LIMU
METH
CL_NWBC_SAPGUI_SHORTCUT CONSTRUCTOR

00003

3
1
\\\\\no_empty_blocks/////
1
\\\\\comments_not_ignored/////
1
\\\\\delta_normalized/////
1
0
1
1
0
0
204
METHOD constructor.

" SYSTEM

mv_system_id = iv_system
_id.

mv_client_id = iv_client
_id.

mv_system_description = iv_system
_description.
mv_application_server_name = iv_applic
ation_server_name.

mv_system_number = iv_system
_number.

mt_gateway_hosts = it_gatewa
y_hosts.

mv_message_server_name = iv_messag
e_server_name.

mv_service_port = iv_servic
e_port.

mv_logon_group = iv_logon_
group.

" USER

mv_user_id = iv_user_i
d.
mv_password = iv_passwo
rd.

mv_language = iv_langua
ge.

" FUNCTION

mv_system_command = iv_system
_command.

mv_report_name = iv_report
_name.

mv_report_variant = iv_report
_variant.

mv_transaction_code = iv_transa
ction_code.
mv_skip_initial_screen = iv_skip_i
nitial_screen.

mt_parameters = it_parame
ters.

mv_title = iv_title.

" OPTIONS

mv_trace_level = iv_trace_
level.

mv_work_directory = iv_work_d
irectory.

mv_gui_size = iv_gui_si
ze.

mv_reuse_existing_connection = iv_reuse_
existing_connection.
" now complete defaults

DATA: lv_usr_snc TYPE snc_pname,

lv_sys_snc TYPE pname_appl,

lv_sys_snc_qop TYPE snc_qop VALUE


'9',

ls_bapi_snc TYPE bapisncu,

lt_bapiret TYPE bapirettab,

lv_rfc_dest LIKE iv_sm59_destin


ation.
lv_rfc_dest = iv_sm59_destination.

" if nothing is provided, assume local s


ystem

IF lv_rfc_dest IS INITIAL AND iv_applica


tion_server_name IS INITIAL AND

iv_message_server_name IS INITIAL AND


iv_logon_group IS INITIAL.

lv_rfc_dest = sc_local_system.

ENDIF.
IF lv_rfc_dest EQ sc_local_system.

CALL FUNCTION 'CREATE_RFC_REENTRANCE_T


ICKET'

IMPORTING

ticket = mv_sso_co
okie

EXCEPTIONS

ticket_logon_disabled = 1

ticket_creation_failed = 2

OTHERS = 4.
IF sy-subrc IS NOT INITIAL OR mv_sso_c
ookie IS INITIAL.

CALL FUNCTION 'SNC_GET_MY_INFO'


"#EC *

IMPORTING

pname_appl = lv_sys_snc

snc_qop_max = lv_sys_snc_qop

pname_user = lv_usr_snc
EXCEPTIONS

internal_error = 1

snc_not_active = 2

OTHERS = 3.

IF lv_usr_snc IS INITIAL AND sy-subr


c NE 2.

CALL FUNCTION 'BAPI_USER_GET_DETAI


L'

EXPORTING
username = iv_user_id

IMPORTING

snc = ls_bapi_snc

TABLES

return = lt_bapiret.

lv_usr_snc = ls_bapi_snc-pname.
ENDIF.

ENDIF.

DATA: lv_system_text TYPE tmsmconf-sy


stxt,

lv_system_host TYPE tmscdes-rfc


host.

CALL FUNCTION 'TMS_CFG_GET_LOCAL_SYSTE


M_INFO'

IMPORTING
ev_system_text = lv_system_text

ev_system_host = lv_system_host

EXCEPTIONS

OTHERS.

IF sy-subrc IS INITIAL.

mv_system_description = lv_sys
tem_text.

mv_application_server_name = lv_sys
tem_host.
mv_system_number = get_sy
stem_number( lv_system_host(32) ).

ENDIF.

ELSEIF lv_rfc_dest IS NOT INITIAL.

DATA: dest TYPE cl_url=>t_single_sm59_


destination.

cl_url=>resolve_sm59_alias( EXPORTING
alias = lv_rfc_dest IMPORTING sm59_rfc_des
tination = dest ).

IF dest-name IS NOT INITIAL AND dest-r


c IS INITIAL.
lv_rfc_dest = dest-name.

ENDIF.

CALL FUNCTION 'SNC_GET_MY_INFO' DESTIN


ATION lv_rfc_dest "#EC *

IMPORTING

pname_appl = lv_sys_snc

snc_qop_max = lv_sys_snc_qop

pname_user = lv_usr_snc

EXCEPTIONS
internal_error = 1

snc_not_active = 2

OTHERS = 3.

IF lv_usr_snc IS INITIAL AND sy-subrc


NE 2.

CALL FUNCTION 'BAPI_USER_GET_DETAIL'


DESTINATION lv_rfc_dest

EXPORTING
username = iv_user_id

IMPORTING

snc = ls_bapi_snc

TABLES

return = lt_bapiret

EXCEPTIONS

OTHERS.

IF sy-subrc IS INITIAL.
lv_usr_snc = ls_bapi_snc-pname.

ENDIF.

ENDIF.

DATA: lv_loadbalancing TYPE rfcdisp


laz-rfclbflag.

DATA: lv_group TYPE rfcdisp


laz-rfcload.

DATA: lv_client TYPE rfcdisp


lay-rfcclient.
DATA: ls_rfc_system_info TYPE rfcsi.

CALL FUNCTION 'RFC_READ_R3_DESTINATION


'

EXPORTING

destination = lv_rfc_dest

authority_check = ''

bypass_buf = ''

IMPORTING

loadbalancing = lv_loadbalancing
systemid = mv_system_id

systemnr = mv_system_number

server = mv_application_s
erver_name

group = lv_group

client = lv_client

EXCEPTIONS

OTHERS.
IF sy-subrc IS INITIAL.

IF mv_system_id IS INITIAL.

DATA: lv_rfc_dest_s TYPE string.

CONSTANTS: lc_dummy_systemid TYPE


syst-sysid VALUE 'ZZZ'.

lv_rfc_dest_s = lv_rfc_dest.

CALL FUNCTION 'RFC_GET_SYSTEM_INFO


'
EXPORTING

destination = lv_r
fc_dest_s

IMPORTING

rfcsi_export = ls_r
fc_system_info

EXCEPTIONS

authority_not_available = 1

OTHERS = 2.

IF sy-subrc IS INITIAL AND ls_rfc_


system_info-rfcsysid IS NOT INITIAL.

mv_system_id = ls_rfc_system_inf
o-rfcsysid.

ELSE.

mv_system_id = lc_dummy_systemid
.

ENDIF.

ENDIF.

IF lv_client IS NOT INITIAL.

mv_client_id = lv_client.
ENDIF.

IF lv_group IS NOT INITIAL.

mv_logon_group = lv_group.

CONCATENATE '[' mv_logon_group ']'


INTO mv_system_description.

CONCATENATE mv_system_id mv_system


_description INTO mv_system_description SE
PARATED BY space.

ENDIF.

ENDIF.
ENDIF.

IF lv_usr_snc IS NOT INITIAL.

mv_snc_partner_name = lv_sys_snc.

mv_snc_quality_of_protection = lv_sys_
snc_qop.

ENDIF.
ENDMETHOD.

LIMU
METH
CL_NWBC_SAPGUI_SHORTCUT CREATE_TRANS
ACTION_STRING
99997

LIMU
METH
CL_NWBC_SAPGUI_SHORTCUT CREATE_TRANS
ACTION_STRING
00003

3
1
\\\\\no_empty_blocks/////
1
\\\\\comments_not_ignored/////
1
\\\\\delta_normalized/////
1
0
1
1
0
0
51
METHOD create_transaction_string.

DATA: len TYPE i,

lv_name TYPE string,


tr_parms TYPE string.

FIELD-SYMBOLS: <ff> LIKE LINE OF paramet


ers.

" it is not yet clear what control if fi


rst screen should be skept but probably th
is is like this:

" - for SLECTION SCREENs

" You need to add * symbol before tran


saction name (we do it always, if paramate
rs are passed)

" Examples (test in SAP GUI OKCODE fie


ld):
" /n*se16 DATABROWSE-TABLENAME=NWBC_
VC_GUI_TAG - skips selection screen

" /nse16 DATABROWSE-TABLENAME=NWBC_V


C_GUI_TAG - no skipping without * only
filling in of value into selection screen

" - for non SELECTION SCREEN (standard d


ynpro)

" use DYNP_OKCODE parameter instead wi


th corresponding OK code. Most likely DYNP
_OKCODE does work with selection screens a
lso.

" For more details ask Dynpro experts fr


om BC-ABA-SC

CHECK transaction_code IS NOT INITIAL.

rv = transaction_code.
LOOP AT parameters ASSIGNING <ff>.

len = strlen( <ff>-name ).

" try to collect transaction paramater


s to transaction field

CHECK len < 1 OR <ff>-name(1) NE `~`.


" skip ~nosplash, ~transaction etc paramet
ers

CHECK len < 4 OR <ff>-name(4) NS `sap-


`. " skip SAP technical parameters
lv_name = <ff>-name.

TRANSLATE lv_name TO UPPER CASE.

CONCATENATE tr_parms `;` lv_name `=` <


ff>-value INTO tr_parms. "#EC NOTEXT

ENDLOOP.

IF tr_parms IS NOT INITIAL.

" add "skip selection screen" flag for


web gui (make sence only if paramaters ar
e passed)

IF rv CN cl_url=>mc_par_its_skip_sel_s
creen AND skip_selection EQ abap_true.

CONCATENATE cl_url=>mc_par_its_skip_
sel_screen rv INTO rv.
ENDIF.

" add paramaters for transaction

IF rv CA ` `. " already parameters exi


st

CONCATENATE rv tr_parms INTO rv.


"~transaction=*XXX%20abc=123;klm=456

ELSE. " no parameters yet

CONCATENATE rv ` ` tr_parms+1 INTO r


v.

ENDIF.
ENDIF.

CONDENSE rv.

ENDMETHOD.

LIMU
METH
CL_NWBC_SAPGUI_SHORTCUT GET_COMMAND_
STRING
99997

LIMU
METH
CL_NWBC_SAPGUI_SHORTCUT GET_COMMAND_
STRING
00003

3
1
\\\\\no_empty_blocks/////
1
\\\\\comments_not_ignored/////
1
\\\\\delta_normalized/////
1
0
1
1
0
0
19
METHOD get_command_string.

* Create Command string

DATA: lv_command_part LIKE rv_command.

IF mv_transaction_code IS NOT INITIAL. "


Transaction

rv_command = create_transaction_string
( transaction_code = mv_transaction_code p
arameters = mt_parameters skip_selection =
mv_skip_initial_screen ).

ELSEIF mv_report_name IS NOT INITIAL. "


Report
IF mv_report_variant IS NOT INITIAL.

CONCATENATE mv_report_name space mv_


report_variant INTO lv_command_part RESPEC
TING BLANKS.

rv_command = surround( text = lv_com


mand_part ).

ELSE.

rv_command = surround( mv_report_nam


e ).

ENDIF.

ELSEIF mv_system_command IS NOT INITIAL.


" System Command

rv_command = surround( mv_system_comma


nd ).

ENDIF.
ENDMETHOD.

LIMU
METH
CL_NWBC_SAPGUI_SHORTCUT GET_COMMAND_
TYPE_STRING
99997

LIMU
METH
CL_NWBC_SAPGUI_SHORTCUT GET_COMMAND_
TYPE_STRING
00003

3
1
\\\\\no_empty_blocks/////
1
\\\\\comments_not_ignored/////
1
\\\\\delta_normalized/////
1
0
1
1
0
0
11
METHOD get_command_type_string.
IF mv_transaction_code IS NOT INITIAL.

rv_command_type = sc_command_type_tran
saction.

ELSEIF mv_report_name IS NOT INITIAL.

rv_command_type = sc_command_type_repo
rt.

ELSEIF mv_system_command IS NOT INITIAL.

rv_command_type = sc_command_type_syst
em_command.

ENDIF.

ENDMETHOD.
LIMU
METH
CL_NWBC_SAPGUI_SHORTCUT GET_GUI_PARA
M_STRING
99997

LIMU
METH
CL_NWBC_SAPGUI_SHORTCUT GET_GUI_PARA
M_STRING
00003

3
1
\\\\\no_empty_blocks/////
1
\\\\\comments_not_ignored/////
1
\\\\\delta_normalized/////
1
0
1
1
0
0
53
METHOD get_gui_param_string.

* Create GuiParm string

DATA: lv_service_port TYPE char20,


lv_snc_string TYPE string,

lv_snc_string2 TYPE string.

FIELD-SYMBOLS: <ls_gateway_host> LIKE LI


NE OF mt_gateway_hosts.

* append routers

LOOP AT mt_gateway_hosts ASSIGNING <ls_g


ateway_host>.

CONCATENATE rv_parameters `/H/` <ls_ga


teway_host>-router `/S/` <ls_gateway_host>
-routerservice INTO rv_parameters.

ENDLOOP.
IF mv_application_server_name IS NOT INI
TIAL.

* Set System by Application Server and


System Number

IF rv_parameters IS INITIAL.

CONCATENATE mv_application_server_na
me mv_system_number INTO rv_parameters SEP
ARATED BY space.

ELSE.

CONCATENATE rv_parameters mv_applica


tion_server_name mv_system_number INTO rv_
parameters SEPARATED BY space.

ENDIF.
ENDIF.

IF mv_system_id IS NOT INITIAL AND mv_ap


plication_server_name IS INITIAL.

CONCATENATE rv_parameters `/R/` mv_sys


tem_id INTO rv_parameters.

ENDIF.

IF mv_message_server_name IS NOT INITIAL


.

CONCATENATE rv_parameters `/M/` mv_mes


sage_server_name INTO rv_parameters.

ENDIF.
IF mv_service_port IS NOT INITIAL.

lv_service_port = mv_service_port.

CONCATENATE rv_parameters `/S/` lv_ser


vice_port INTO rv_parameters.

ENDIF.

IF mv_logon_group IS NOT INITIAL.

CONCATENATE rv_parameters `/G/` mv_log


on_group INTO rv_parameters.
ENDIF.

IF mv_snc_partner_name IS NOT INITIAL.

CONCATENATE `SNC_PARTNERNAME=` sc_quot


ation mv_snc_partner_name sc_quotation INT
O lv_snc_string.

CONCATENATE `SNC_QOP=` mv_snc_quality_


of_protection INTO lv_snc_string2.

CONCATENATE rv_parameters lv_snc_strin


g lv_snc_string2 INTO rv_parameters SEPARA
TED BY space.

* SNC_PARTNERNAME="p:CN=QPT, O=SAP-AG
, C=DE" SNC_QOP=3
ENDIF.

rv_parameters = surround( text = rv_para


meters ).

ENDMETHOD.

LIMU
METH
CL_NWBC_SAPGUI_SHORTCUT GET_SHORTCUT

99997

LIMU
METH
CL_NWBC_SAPGUI_SHORTCUT GET_SHORTCUT

00003
3
1
\\\\\no_empty_blocks/////
1
\\\\\comments_not_ignored/////
1
\\\\\delta_normalized/////
1
0
1
1
0
0
88
METHOD get_shortcut.

DATA: lv_value TYPE string.

* SYSTEM

add_header( EXPORTING header = sc_header


_system CHANGING data = et_shortcut ).
add_option( EXPORTING name = `name` valu
e = mv_system_id CHANGING data = et_short
cut ). "#EC NOTEXT

add_option( EXPORTING name = `client` va


lue = mv_client_id CHANGING data = et_sho
rtcut ). "#EC NOTEXT

IF mv_system_description IS NOT INITIAL.

CONCATENATE sc_apostrophe mv_system_de


scription sc_apostrophe INTO lv_value.

add_option( EXPORTING name = `descript


ion` value = lv_value CHANGING data = et_
shortcut ). "#EC NOTEXT

ENDIF.

DATA: lv_gui_parameters TYPE string.


lv_gui_parameters = get_gui_param_string
( ).

add_option( EXPORTING name = `guiparm` v


alue = lv_gui_parameters CHANGING data =
et_shortcut ). "#EC NOTEXT

******************************************
******************************

* USER

add_header( EXPORTING header = sc_header


_user CHANGING data = et_shortcut ).
IF mv_sso_cookie IS NOT INITIAL.

CONCATENATE '"MYSAPSSO2=' mv_sso_cooki


e '"' INTO lv_value. "#EC NOTEXT

add_option( EXPORTING name = `at` valu


e = lv_value CHANGING data = et_shortcut
). "#EC NOTEXT

ENDIF.

add_option( EXPORTING name = `name`


value = mv_user_id CHANGING data = et_sho
rtcut ). "#EC NOTEXT

add_option( EXPORTING name = `password`


value = mv_password CHANGING data = et_sho
rtcut ). "#EC NOTEXT

add_option( EXPORTING name = `language`


value = mv_language CHANGING data = et_sho
rtcut ). "#EC NOTEXT
******************************************
******************************

* FUNCTION

add_header( EXPORTING header = sc_header


_function CHANGING data = et_shortcut ).

DATA: lv_command TYPE string,

lv_command_type TYPE string.


lv_command = get_command_string( ).

lv_command_type = get_command_type_strin
g( ).

add_option( EXPORTING name = `type` v


alue = lv_command_type CHANGING data = et
_shortcut ). "#EC NOTEXT

add_option( EXPORTING name = `command` v


alue = lv_command CHANGING data = et
_shortcut ). "#EC NOTEXT

add_option( EXPORTING name = `title` v


alue = mv_title CHANGING data = et
_shortcut ). "#EC NOTEXT

******************************************
******************************
* OPTIONS

add_header( EXPORTING header = sc_header


_options CHANGING data = et_shortcut ).

IF mv_reuse_existing_connection EQ abap_
true.

add_option( EXPORTING name = `reuse`


value = `1` CHANGING data = et_shortcut ).
"#EC NOTEXT

ELSE.

add_option( EXPORTING name = `reuse`


value = `0` CHANGING data = et_shortcut ).
"#EC NOTEXT

ENDIF.
******************************************
******************************

* CONFIGURATION

add_header( EXPORTING header = sc_header


_configuration CHANGING data = et_shortcut
).

add_option( EXPORTING name = `guisize`


value = mv_gui_size CHANGING data =
et_shortcut ). "#EC NOTEXT

add_option( EXPORTING name = `workdir`


value = mv_work_directory CHANGING data =
et_shortcut ). "#EC NOTEXT

add_option( EXPORTING name = `trace`


value = mv_trace_level CHANGING data =
et_shortcut ). "#EC NOTEXT

******************************************
******************************

** SNC

* lv_value = sc_header_snc.

* APPEND lv_value TO et_shortcut.

* IF mv_snc_partner_name IS NOT INITIAL.

* CONCATENATE 'name='
* sc_apostrophe

* mv_snc_partner_name

* sc_apostrophe INTO lv_val


ue.

* APPEND lv_value TO et_shortcut.

* IF mv_snc_quality_of_protection IS NO
T INITIAL.

* CONCATENATE 'qop=' mv_snc_quality_o


f_protection INTO lv_value.

* APPEND lv_value TO et_shortcut.

* ENDIF.

* ENDIF.
******************************************
******************************

ENDMETHOD.

LIMU
METH
CL_NWBC_SAPGUI_SHORTCUT GET_SYSTEM_N
UMBER
99997

LIMU
METH
CL_NWBC_SAPGUI_SHORTCUT GET_SYSTEM_N
UMBER
00003

3
1
\\\\\no_empty_blocks/////
1
\\\\\comments_not_ignored/////
1
\\\\\delta_normalized/////
1
0
1
1
0
0
16
METHOD get_system_number.

IF iv_host IS NOT INITIAL.

SELECT SINGLE instno


"#EC *

FROM sapwlserv

INTO rv_system_number

WHERE host = iv_host.

ENDIF.
IF rv_system_number IS INITIAL.

DATA: sysno(2).

CALL 'C_GET_SYSTEM_NUMBER' ID 'SYSTEM'


FIELD sysno. "#EC CI_CCALL

rv_system_number = sysno.

ENDIF.

ENDMETHOD.

LIMU
METH
CL_NWBC_SAPGUI_SHORTCUT SURROUND

99997
LIMU
METH
CL_NWBC_SAPGUI_SHORTCUT SURROUND

00003

3
1
\\\\\no_empty_blocks/////
1
\\\\\comments_not_ignored/////
1
\\\\\delta_normalized/////
1
0
1
1
0
0
13
METHOD surround.

IF symbol IS INITIAL.

rv = text.

ELSEIF text IS NOT INITIAL.

IF blanks EQ abap_true.
CONCATENATE symbol text symbol INTO
rv RESPECTING BLANKS.

ELSE.

CONCATENATE symbol text symbol INTO


rv.

ENDIF.

ENDIF.

ENDMETHOD.

LIMU
METH
CL_NWBC_SAPGUI_SHORTCUT URL
99997

LIMU
METH
CL_NWBC_SAPGUI_SHORTCUT URL

00003

3
1
\\\\\no_empty_blocks/////
1
\\\\\comments_not_ignored/////
1
\\\\\delta_normalized/////
1
0
1
1
0
0
59
METHOD url.

DATA: lv_query TYPE string,

lv_user TYPE string,

lv_xuser TYPE xstring,


lv_parameters TYPE string,

lt_fields TYPE tihttpnvp.

" create base url

rv_url = cl_nwbc=>url_base( server = iv_


server cockpit = if_nwbc_runtime=>cockpit_
sapguilink ).

" extract existing parameters

SPLIT rv_url AT `?` INTO rv_url lv_query


.

cl_nwbc_utility=>string_to_fields( EXPOR
TING iv_string = lv_query IMPORTING et_fie
lds = lt_fields ).
" add service related parameters

add_url_param( EXPORTING name = gc_s_url


_param-transaction value = iv_transaction_
code CHANGING fields = lt_fields ).

add_url_param( EXPORTING name = gc_s_url


_param-destination value = iv_sm59_destina
tion CHANGING fields = lt_fields ).

add_url_param( EXPORTING name = gc_s_url


_param-skip_sel_screen value = iv_skip_ini
tial_screen CHANGING fields = lt_fields ).

" encode user name

lv_user = iv_user_id.

CALL FUNCTION 'SCMS_STRING_TO_XSTRING'


EXPORTING

text = lv_user

IMPORTING

buffer = lv_xuser

EXCEPTIONS

OTHERS.

IF sy-subrc IS INITIAL.
CALL FUNCTION 'SCMS_BASE64_ENCODE_STR'

EXPORTING

input = lv_xuser

IMPORTING

output = lv_user

EXCEPTIONS

OTHERS.

IF sy-subrc IS INITIAL.

add_url_param( EXPORTING name = gc_s


_url_param-user value = lv_user CHANGING f
ields = lt_fields ).

ENDIF.

ENDIF.

" pack transaction parameters

lv_parameters = cl_nwbc_utility=>fields_
to_string( it_fields = it_parameters ).

add_url_param( EXPORTING name = gc_s_url


_param-parameters value = lv_parameters CH
ANGING fields = lt_fields ).

" strip host part, if not needed


IF iv_server_relative_url EQ abap_true A
ND rv_url IS NOT INITIAL AND rv_url(1) NE
`/`.

REPLACE FIRST OCCURRENCE OF REGEX `htt


ps?://[A-Za-z0-9]+(?:-[A-Za-z0-9]+)*(?:\.[
A-Za-z0-9]+(?:-[A-Za-z0-9]+)*)*:\d{2,6}`

IN rv_url WITH ``.


"#EC NOTEXT

ENDIF.

lv_parameters = cl_nwbc_utility=>fields_
to_string( it_fields = lt_fields ).

IF lv_parameters IS NOT INITIAL.

CONCATENATE rv_url `?` lv_parameters I


NTO rv_url.

ENDIF.
ENDMETHOD.

LIMU
METH
CL_URL GET_TRANSACT
ION_NAME
00006

LIMU
METH
CL_URL GET_TRANSACT
ION_NAME
00009

3
1
\\\\\no_empty_blocks/////
1
\\\\\comments_not_ignored/////
1
\\\\\delta_normalized/////
1
0
1
9
6
DATA: path TYPE string,

query TYPE string,


parms TYPE tihttpnvp.

FIELD-SYMBOLS: <ff> LIKE LINE OF parms.

1
CHECK iv_url CS mc_path_its. " be sure t
hat we have ITS URL

3
CLEAR: ev_name, ev_skip_sel_screen, et_p
arameters.

CHECK iv_url CS mc_path_its. " be sure t


hat we have ITS URL

LIMU
REPS
NWBC_DELETE_MENU_CACHE

00005

LIMU
REPS
NWBC_DELETE_MENU_CACHE

00008

36
1
\\\\\no_empty_blocks/////
1
\\\\\comments_not_ignored/////
1
\\\\\delta_normalized/////
3
\\\\\allowed/////
FORM
*
3
\\\\\allowed/////
FUNCTION
*
3
\\\\\allowed/////
MODULE
**
3
\\\\\allowed/////
REPORT
*
3
\\\\\allowed/////
PROGRAM
*
3
\\\\\allowed/////
FUNCTION-POOL
*
4
\\\\\allowed/////
CLASS
*
DEFINITION
4
\\\\\allowed/////
CLASS
*
IMPLEMENTATION
5
\\\\\forbidden/////
CLASS
*
DEFINITION
DEFERRED
5
\\\\\forbidden/////
CLASS
*
DEFINITION
LOAD
6
\\\\\forbidden/////
CLASS
*
DEFINITION
LOCAL
FRIENDS
3
\\\\\allowed/////
AT
LINE-SELECTION
3
\\\\\allowed/////
AT
USER-COMMAND
4
\\\\\allowed/////
AT
SELECTION-SCREEN
**
3
\\\\\allowed/////
AT
PF*
2
\\\\\allowed/////
INITIALIZATION
2
\\\\\allowed/////
START-OF-SELECTION
2
\\\\\allowed/////
END-OF-SELECTION
3
\\\\\allowed/////
TOP-OF-PAGE
**
2
\\\\\allowed/////
END-OF-PAGE
3
\\\\\allowed/////
GET
**
3
\\\\\forbidden/////
GET
BADI
3
\\\\\forbidden/////
GET
BIT
3
\\\\\forbidden/////
GET
CONNECTION
3
\\\\\forbidden/////
GET
CURSOR
3
\\\\\forbidden/////
GET
DATASET
3
\\\\\forbidden/////
GET
LOCALE
3
\\\\\forbidden/////
GET
PARAMETER
3
\\\\\forbidden/////
GET
PF-STATUS
3
\\\\\forbidden/////
GET
PROPERTY
3
\\\\\forbidden/////
GET
REFERENCE
3
\\\\\forbidden/////
GET
RUN
3
\\\\\forbidden/////
GET
TIME
1
2
REPORT
NWBC_DELETE_NAV_TREE_CACHE
1
3
2
report nwbc_delete_nav_tree_cache.
14
data: lv_cache_counter type i,

lv_cache_counter_string type string.

constants lc_id type indx_srtfd value `nwb


c_cache_counter`.

"Dynamic Call because of decoupling 3.0 ru


ntime and 3.5 runtime

delete from ('NWBC_NAV_TREE').


"#EC CI_NOWHERE

import cache_counter = lv_cache_counter_st


ring from database indx(^c) id lc_id.

lv_cache_counter = lv_cache_counter_string
.
add 1 to lv_cache_counter.

lv_cache_counter_string = lv_cache_counter
.

condense lv_cache_counter_string.

export cache_counter = lv_cache_counter_st


ring to database indx(^c) id lc_id.

9
DATA: lo_runtime TYPE REF TO if_nwbc_run
time,

lo_runtime35 TYPE REF TO if_nwbc_run


time35.
lo_runtime = cl_nwbc_factory=>get_nwbc_run
time( ).

lo_runtime35 ?= lo_runtime.

CHECK lo_runtime35 IS BOUND.

lo_runtime35->invalidate_nav_tree_cache( i
v_all_users = abap_true iv_log = abap_fals
e ).

LIMU
REPS
NWBC_FILE_REPOSITORY

00023

LIMU
REPS
NWBC_FILE_REPOSITORY

00026

36
1
\\\\\no_empty_blocks/////
1
\\\\\comments_ignored/////
1
\\\\\delta_normalized/////
3
\\\\\allowed/////
FORM
*
3
\\\\\allowed/////
FUNCTION
*
3
\\\\\allowed/////
MODULE
**
3
\\\\\allowed/////
REPORT
*
3
\\\\\allowed/////
PROGRAM
*
3
\\\\\allowed/////
FUNCTION-POOL
*
4
\\\\\allowed/////
CLASS
*
DEFINITION
4
\\\\\allowed/////
CLASS
*
IMPLEMENTATION
5
\\\\\forbidden/////
CLASS
*
DEFINITION
DEFERRED
5
\\\\\forbidden/////
CLASS
*
DEFINITION
LOAD
6
\\\\\forbidden/////
CLASS
*
DEFINITION
LOCAL
FRIENDS
3
\\\\\allowed/////
AT
LINE-SELECTION
3
\\\\\allowed/////
AT
USER-COMMAND
4
\\\\\allowed/////
AT
SELECTION-SCREEN
**
3
\\\\\allowed/////
AT
PF*
2
\\\\\allowed/////
INITIALIZATION
2
\\\\\allowed/////
START-OF-SELECTION
2
\\\\\allowed/////
END-OF-SELECTION
3
\\\\\allowed/////
TOP-OF-PAGE
**
2
\\\\\allowed/////
END-OF-PAGE
3
\\\\\allowed/////
GET
**
3
\\\\\forbidden/////
GET
BADI
3
\\\\\forbidden/////
GET
BIT
3
\\\\\forbidden/////
GET
CONNECTION
3
\\\\\forbidden/////
GET
CURSOR
3
\\\\\forbidden/////
GET
DATASET
3
\\\\\forbidden/////
GET
LOCALE
3
\\\\\forbidden/////
GET
PARAMETER
3
\\\\\forbidden/////
GET
PF-STATUS
3
\\\\\forbidden/////
GET
PROPERTY
3
\\\\\forbidden/////
GET
REFERENCE
3
\\\\\forbidden/////
GET
RUN
3
\\\\\forbidden/////
GET
TIME
2
2
REPORT
NWBC_FILE_REPOSITORY
2
4
3
REPORT NWBC_FILE_REPOSITORY.

"Begin of code section: &FILEREPOSITORY


&

"Generation details------------

1
"last modified on: Tue, 19 Feb 2013 12:47:
13 GMT
1
"last modified on: Mon, 08 Apr 2013 09:52:
08 GMT

9
4
"last modified by: BUERNER

"Begin of code section: &REPOSITORY_CLA


SS&

"Generation details------------

1
"last modified on: Tue, 19 Feb 2013 12:47:
13 GMT

1
"last modified on: Mon, 08 Apr 2013 09:52:
08 GMT

3
CLASS
LCL_NWBC_FILE_REPOSITORY
IMPLEMENTATION
3
8
3
data: ls_area_info like line of mt_are
a_info.

ls_area_info-area_name = 'CO
MMON '. "#EC NOTEXT

1
ls_area_info-area_key = '20
130129091758'. "#EC NOTEXT

1
ls_area_info-area_key = '20
130408095208 '. "#EC NOTEXT

56
3
ls_area_info-handler_name = '\P
ROGRAM=NWBC_FILE_REPOSITORY_SRC\CLASS=LCL_
HANDLER_HCB_RTL'. "#EC NOTEXT

insert ls_area_info into table mt_area


_info.

ls_area_info-area_name = 'RT
L '. "#EC NOTEXT
1
ls_area_info-area_key = '20
130219124713 '. "#EC NOTEXT

1
ls_area_info-area_key = '20
130219124713'. "#EC NOTEXT

155
4
endmethod.

method if_nwbc_file_repository~get_hash_
for_all_areas.

1
ev_hash = '20130219124713 '."#EC NOTEX
T

1
ev_hash = '20130408095208 '."#EC NOTEX
T
LIMU
REPS
NWBC_FILE_REPOSITORY_SRC

00023

LIMU
REPS
NWBC_FILE_REPOSITORY_SRC

00026

36
1
\\\\\no_empty_blocks/////
1
\\\\\comments_ignored/////
1
\\\\\delta_normalized/////
3
\\\\\allowed/////
FORM
*
3
\\\\\allowed/////
FUNCTION
*
3
\\\\\allowed/////
MODULE
**
3
\\\\\allowed/////
REPORT
*
3
\\\\\allowed/////
PROGRAM
*
3
\\\\\allowed/////
FUNCTION-POOL
*
4
\\\\\allowed/////
CLASS
*
DEFINITION
4
\\\\\allowed/////
CLASS
*
IMPLEMENTATION
5
\\\\\forbidden/////
CLASS
*
DEFINITION
DEFERRED
5
\\\\\forbidden/////
CLASS
*
DEFINITION
LOAD
6
\\\\\forbidden/////
CLASS
*
DEFINITION
LOCAL
FRIENDS
3
\\\\\allowed/////
AT
LINE-SELECTION
3
\\\\\allowed/////
AT
USER-COMMAND
4
\\\\\allowed/////
AT
SELECTION-SCREEN
**
3
\\\\\allowed/////
AT
PF*
2
\\\\\allowed/////
INITIALIZATION
2
\\\\\allowed/////
START-OF-SELECTION
2
\\\\\allowed/////
END-OF-SELECTION
3
\\\\\allowed/////
TOP-OF-PAGE
**
2
\\\\\allowed/////
END-OF-PAGE
3
\\\\\allowed/////
GET
**
3
\\\\\forbidden/////
GET
BADI
3
\\\\\forbidden/////
GET
BIT
3
\\\\\forbidden/////
GET
CONNECTION
3
\\\\\forbidden/////
GET
CURSOR
3
\\\\\forbidden/////
GET
DATASET
3
\\\\\forbidden/////
GET
LOCALE
3
\\\\\forbidden/////
GET
PARAMETER
3
\\\\\forbidden/////
GET
PF-STATUS
3
\\\\\forbidden/////
GET
PROPERTY
3
\\\\\forbidden/////
GET
REFERENCE
3
\\\\\forbidden/////
GET
RUN
3
\\\\\forbidden/////
GET
TIME
2
2
REPORT
NWBC_FILE_REPOSITORY_SRC
2
4
3
REPORT NWBC_FILE_REPOSITORY_SRC.

"Begin of code section: &FILEREPOSITORY


&
"Generation details------------

1
"last modified on: Tue, 19 Feb 2013 12:47:
17 GMT

1
"last modified on: Mon, 08 Apr 2013 09:52:
09 GMT

9
4
"last modified by: BUERNER

"Begin of code section: COMMON

"Generation details------------

1
"last modified on: Tue, 29 Jan 2013 09:17:
59 GMT

1
"last modified on: Mon, 08 Apr 2013 09:52:
09 GMT

3
CLASS
LCL_HANDLER_COMMON
IMPLEMENTATION
2
59
3
when 'general.js'.

concatenate lv_string_base64

70
`7X1rdxs3suDnm3PyH6Cee0IyokhJSeZuJDNZ2ZZj7
fi1ljLOrKThaZEtqeNmN9PdlK3raH/7VhXej26Ssp3
ZO3c4E5kECoVCoVBVAArATVyyeVl89+24TspZmsd1U
bIRi6L9L7+4CeSN35XxfJ4EYKrrJMvgbzxPMHMWp7k
NMCnyOsnr8WUZz5JxOkUoK80Gv0nKKi3y8XVcXfu1X
SZxvSiTCnI+vEvzafHu5TzJ0/zqTVpfPynK2R6`"#E
C *
`ry0VyZxXigOMc6oJy/NcAf1lQ02KymCFR0xSbKX8O
rpL6MEvwa/Xw9iS+egEFu52nJ8+fdXqn2+cDBP/9dw
0vfkdZXUb7w+HF4opdpu/ZJTD4yZMvv8D/YaXJfDJ7
WBbvKmIqJwGqGl/wtG4PiLtc5JMamBHKZh++/IIxll
6ybh7fpFfYS4ObBNpWsq++Ym7aAFqdvH952Y0O5vMs
iXrshxHblljgUybA2Jx9s7PPhsPDV4+eD44Pnh`"#E
C *
`y8PtongDuWZFVyj9p+KoqrT1TdAtp9cIUsVtifpGV
yWbxvRL+r0T9/+X+Onj07WA//8+Ojw0bkBm4AsxC7o
NsK9OXJ08PXAvbLL+4C0vBXPgBCQiEHxxLh0GCGkFj
yNgLGGw1CCqjNUGkrPwRtUW9fFkXUouiIbQFS1WIJw
TlNIJsj9j+8DnAI270XYUoQPh9h96KLC9C9ifpOSYr
M8iXLgBBp87iskidZEddB6a4WF1Vdgs7kpPSQP`"#E
C *
`EsQX2VxDepqZongXCQ2yZ7OD2omma1Z8wYMxfKh9e
Jk/OrZwcmTl6+fe7xYVsPzeNKsePTgPXjUXMWSgewX
JEY67Jlcx/lV4hnCbjqVdDVbyvQJ/jiajiO2ydLpvm
JtwD49vD2adjtpDpyYJGPBGSCj00MdvVaBQR2XAIdi
2rHI6hisvB/GhsbK4cfY8iaCK5KlE0I8BjGfLmmgD/
5xzWvB19441TJKrwZZkl/V165y4ZnoWoAIsCU4`"#E
C *
`LXjh4SyBX+LZpIIRqxOwBsIVKJSDyB9GJTh/AEfgS
s2QKsah0s2Td+wxQHR7PaTkJEUoPWBCPpS0NzCoL7k
FYe+K8m1cFot8Si7bRTx5yy4Wdc3JuIDmWUaAiFnuL
po8mGRFnrwopkkXXdVeGxu5vAk+gZiVCQ2sR9dpBuq
DcPbXqLpnyuFS3bTf1BHxdHoIfl79LK2gEDCyuPi1z
+rbORBzmZv6HzIGLrQh6aHsrsQD/8WggiXNWuV`"#E
C *
`TqbqOJ9dU0MWnc7oRuCqgNhVlrVq6TGbFTbJGwwIF
HFpCKFdq3jRpap6Rs6R55twmQfjncR5f0WxDtpwPIj
WMxvPFBSg2RmP+w92+zsgE9ZWTkdJX+ikKD8o4rXiT
jYrQTpOoxnU8hmYkE7Nd2OoNYkxxSYA4MMH2cS8l4h
OMWSLV5Q9gz43SyjirgXSnRpSuDoeo8QsmaLIdggBR
vW7qKdZ5LkjhxYgUF8Iky6IK1Uc3HYHLkD5oKL`"#E
C *
`Sfbm7ahZCTDuxpet41GbdvgN/ZbcYm2b2RXCGy0u8
L/PlH9EErbzewirgs49vIxuaCAv2n5z5yxeJ2DpuYk
R4fO2dPz+kJp00+vwOUDuaL6rpL2PZVnyhcsmOon+7
IPAVUESjyX56+tjxpsWrxy/NnT+t6/jr5bZFU5hgaD
tkETApx5OjwPzb7TEyJ+uzRdVng4Hs5T8q4z47jy7h
MHb+WjKeNvNuzdVNDVX/uw5/vQugOoEk3yS8vS`"#E
C *
`WrBG08nZVEVlzU14uTkVdRrV8hVkk/HwAdjGao7KW
azOJ/2GUxnjmagzp7EWYY22uQVFzd/fWvDkGdQAG6+
4Y5t96y+N5AKArjkGshEusZBSCQ0wB48fPn6JOL4gI
NVEpeTa+JhcXzw6jiZLJjQTXXB0JesrxN2dHIMP98m
ORWry1trBmoZ7bAPQg5E2NvSeoQ0eV0pPPkiyyzdaF
eETUcQa7SQmVAtGdm0DcSvN1yIFRjwzapLDk+N`"#E
C *
`J1QVQhnUttXUxJEIGPvk9cHzw53IUqeCAI0+2FYx8
I3WqgJrtNRUIs73P5gJu/8FmNBEA8kdDRFXcANYBj8
l9XFS4RLWCRbxG6RQNZbpurwyXDddaFxxTKDEqmqla
qwSLSxitkmlMr6t5ummtfZo0HMiQwWqtZMfI450ayf
Q675q3YTqf4z2XUjXdCzB8FUAg5sQLPh/jw8fjY8Pj
49PXv7l8MUIvWLOgVVkTbhOMKGfXHeT3oc7UM/`"#E
C *
`xZALdgKp4lZHF3sUVmyZ5mkyVawyGy1w/I3uurckG
/DasNwebF/PFPGDttMSZRulO2gR7WbK5XvjAr0ExBy
GOfjo8ifoeM+1JiSVqVPZdWl8/KhNoap0CIFlUmCkn
l2meTEFiQjAj2pGxSchhKj+9rWqYrfMJqDUp+UC1Xq
fVgMCOEWw0+hblmlKx3KLaGO1ub3tpYHTjLCnB33h8
/HyPuHFMWdRHNF3S4PAr6p/lLC9qFsPUHvt7mm`"#E
C *
`TgtZTs1euX3327BUho3gAa8s5qAjonXWs+TfLDQIB
sp9p1VGhU0cTfGhZkg2dXphXn6x1CY3cjyLX1NCQMq
nKielt3owdV32bJ4Cat0os0S+tb9Eeu0yl0kTXgVM0
XxfR2gPt9+VQsNcyudNWBQb2q/N556w/+9mPIFWzEv
NzrUzuXS7w/CdfsBQoXnMZPYy0gUV8J4kgNSQ8Q0x8
tqrqYPQZxoqwkRzf659dHj4rZvMixk120vT6Lx`"#E
C *
`hdZnL+FwRpdJ+nVdT3a2d7uv0un9TUOgH6ZVOl/ov
D2s+SyxqRvd/sVyE6S/yJ+1cV8tC3S/jballJkqQ7R
uEsQgUrJtSnTK3RaYEmFzz7HixzXSccw1KeZ3LwcDp
2lNj5P2WPPU7C2+RXjhRitXbA0F2tt1YC94utwwNtF
NqXBewv+8kWChdKqyGDUTAdmE0Ghq/Fo7+rgRhjqEN
F84BR5GuJnlWSXdq52pqYFbnUTCgPaze9ZumDd`"#E
C *
`ui3Ti7V7i2URZxJIh6E+cZ5gj+Ui53DQs9LOfQuG7
s7SJ+EKLmASWSZ+NclNzWuisflzXsU3yRRl+yEV+Jn
Xh1Cqyu9klbI/hN6DeeobZKVoep8VMPcpjydlOq8r4
db1oWcPMm4PaKGdDBWkwtftPoP5JocXhZ8CYJ/xVfm
XZXqV5n2WxRUabrv+d6Dfki6nQHWB+EldYMoP/wg8T
MLtuwCqPQLPPC6BpR6YI5xaYwca6hWGj2qorql`"#E
C *
`9KRgUCPQhLgQ3otNMV9gbcFUEGfVCqIxlGROrsyTj
FROjxCxymp5j/Qc1KO6LRZ10O2iNt/J3FxMuYY+Tao
7SlZQd4QWjbcXVJBauwWewcE8agC8A8i3u+oGeuYZe
RRehGAwG4QJ3geRQGvmAJh0BOeMfJdktrkFbX5goBm
gjUWXXyft6+Gt8E4uSSwtWZh9EjX2AVorzvwHjcNgk
9ZQJf8wxC6SKwTbICr7hNgDLUheTIkOLOhyiHf`"#E
C *
`VArovKH22yCm3UvmkSQp+K6OsmFgHCZkk21MpoqVo
JcD3NQQVjpBGS0DU0vLARnrbucD3dscwBX6iHMSmGp
LX5yAfjNLlYXF0l5b7YS4RRNwcmPoc5ELiuGm3n6w6
oc9Dhdz0wJU080Q7iZ2jhjNPUcU0R2dcbsLsgm8RtS
TSwegUOrNbwpS1fotVIn16mZVWTX90mBRo+zcFfqLl
Z7YYMnYnxnj2icZluv6qsaTivpO7EiOsmO9yNN`"#E
C *
`HLtX019Hok+99wPr8+lO9RjFd8ALhZ1916eUR+8f/
hj79DemW5xN9nl7aFG4KyS1Sn6rzgBhnphuGfx+2TK
uCf45RdLfOLwVgAhsTa7UbuJbXRL49GujnLn8Bf4HW
TKZe6gmsPsrxsNop4GJCA559HFxODQcKC8EnBjJmQ/
uEcT6fWM4d+7Z9Pfzwa9zX8fDmrcPZCV9lSQk14GoK
Uns14KgPDAsLWz+D2xAGrd1YUVmacmmi22Q1s5`"#E
C *
`EfS/KrcJuMO1PhgpqEDl1uzI8/oNRlVZOkm6O73Br
0WaE3Od5RoDaeNKgYCUvh6TmyKWEOwHBO1eUmZE7/K
VTdxaxK1dqvkS3O0Tsn97wEouAcVFfjTVP1FHPoTh8
yoGtVntcQ+dcqCUmSELwCy1yG5ggvYcprw6mZvZk7T
OjMSZAAEGhMdEtbiYgRznAGcOjEuKWGtc7eaByjokS
fYTFi2y6fgmzhYUWHxJMWTCLqHn15kU8zTpIBT`"#E
C *
`jUHsoTBoV9FuaVX3astFAbAbzfZiWYuNhqizWBnn4
z+w0quI5+VBb0KGQfTtO62QWnTtRhjPgUJoj2TsY4x
IIVcZ1jbLOIvajYA/ADuC/8c6AF36WXNZsryHzNS4p
2FtBusrddavcbatyt7lKcEML6Jzi8rIyo6jibLLA2f
zYym+MC4uwliwGYbmeoxHoDW6tWlTWuC6urjLUZN2V
kWGjUczbIs3cMoMJ+KYVzpf0wjqveiyW3wjt1s`"#E
C *
`46SNciIDx3W2SQZewN/MiiXyKGY87uFlMy+cBoFNs
Byby1bmyKLrRyG1fdTNmSaXbny1S3swx6MdusvTECA
9swFecItqylTszBheuymsDIxPyxlw8jGaO0/ooN81q
PysdrtWh4E23uNojFXrBTna0OqpvfFmn5ttpCNfg/v
xl8B2YtS26SbIdhnTB5pS2JGFfcORpzT8NLcesQH7N
vNk1ObHp6gpdsh0Fa91tqpU7YtHq/FePuCrXur`"#E
C *
`lqrJV8rwJv9vgK4K6hmkeUjBt0zIzm4Ut4seeiIKC
ZYHstwSCJeZkqbYmw0kDiGNDRAeqQPh0qdaIcS3D0o
CbAKDM2isLzBfY/3VgjrzJraafuKAi4NomErrVXS9w
Ph8Cut2fk5r+bJJL1Mkymt81DwvLU6el0W71jy3mdg
eGna4gZ8t8JJtWPAGRgJ3WCsa1GkeSJUaziaiyy9CY
azS2puo8LC6kCyAjsDHiIeo7XJoqa9hHDVVMTY`"#E
C *
`ZzXljDeWysWcV5u4q4vDUMqB8FPhtzhG0N3u4w/eI
OiUxr2A5D24o3mcmd4bLuo+S/O3j2B8BrZyxHxQlmR
OIJ6bbRjoMIJBBoMoNdEY3LdGj+h9VDBMzR90uhwmY
76fZEiIIcU3tFBXl9lfklu0WLJVuslEyUVRZEmcU4v
sLJp7etGBgqZdsz43bEKG8aGDDNNi1VoHFc2kAGagD
yKYH7+VAjgcAPGBeRhUBYs8/W1BQUehWIBQVVF`"#E
C *
`WbWkHe284jDZtTF6kgBsqYO31CxKHw3cJqxZzmL8k
DL5exzcJixmv1SoebnwT00kouHCFhc4sSAkD0bik69
TUx3kQ9TL/5v9n7sSaG3T7lsZzhh/g5zs5Y1UxH4H4
92jaZ2VR1Pgv+RpHU1MfTmKY9mfGVgSzhikeh3HHpp
FlRQQDlCQscmY6oFoOMBIU6nGKgcNa5nuTAuxPPB+g
Edwrcr4e9kI0BhkTSLN0K0kOzmJJkK78FW0OsZ`"#E
C *
`WC46w43Be7T/ZCEBkCMhW4/bQP/zxQ9EvlDlzY4Jy
DfDfM12CfLAcq2lII3lBR3SC+gE4xygZF09TuFMgnU
IiuNHqqkSdltoVHcSkcyA4HXloibOZUM6ywkGWHKVY
KZKSwNUr25wHcuPFcDJtw9TVaMTVJ+xOeG3ONM5MWU
ls/PES33Wdu2XCINmN6b9dbnGRdrzJNK68TrfGf0Bo
v57xVPy5lBu29LRFOTAoPCk1mlR16jWWEiqDTU`"#E
C *
`+T/dxzhFsWaulGqmIbZ6bOjyKWXucfxPr6Wx0d/DV
UTGtlUk/Tx/LEsOUUhkADpDEaHYzRF3+HmHueHgSWC
eRk4MK0brYuIGg0c4oBQdwg4hle2tWC+o9BEQZVkH0
0B4AhQwOSOarO6WqFvubFq6tqDqF1Tf3x/UpvbLQj2
9QqGxuOv64fyDxq9MfxfrOMOFvMprotBymVZzOiyhH
EGviP3+TwHzYvjsbuTL+fjpNfoWYyrZCgI+65a`"#E
C *
`apTnoM6U3Xma0gJ9S2Uo9y7pq9QdqhI7sS6TNmtCp
RHGk1BRE+Y1OKxiOXFyncPEHxyOl7R+vuqynF+dRJl
W9VF1OJtTjJ5lIF3QRYb7YwSVJA0D4ednDXWpUfErH
xW/wqjgCNWw+DVwMskiQAwRXuz01/NgRaxdz1Bfbje
pmiCWlPf8IhtLU3jUNKvQhbEgD4KcphXoJ4qAvADP+
60fcWx97A4x/N82OgWhcv3DXLmEUeKIjalLMTL`"#E
C *
`DWR7GiWMYHQYoroyPt9XXNv5HRPjxYkpmvah35+OF
aVufFQZjRw7GzmoGO/hRYv2Wi/VbEGsaHlKo37YJtU
WukG4sffq2UbbV557GNIzroy1s8OOZ3eCnvSNbcluy
ms4AGJ/wCM2L3LMIq9QZTA8mkkExxzjXuuuOq8bWrT
WafApbljTYckfKuhRETEXDqwM4+DA43Qo0+Ij9VJga
PeWr2k3bRvbeCZahY6C6lEYhwhY6g45RAyp+Dd`"#E
C *
`zp2Dlyz8ZMB4Qv3jx8ZKRaVMrEkMNoktbgN5ICEEH
jpjDYdJqITLeyZZYDeA1WNC0c263BvaRBp8nxtwHbS
eJ/na4x2iT7Zkv2zUeyb8S+9fkne3Mp9ziWDb8XZN+
LTTavoJEfrOROHKteuhNjbBqttPcjKm4pYQMLwkLwO
H4N4OiXKLAttM4mzufai/GO+dbjSVG8TRNxSQC1AO8
KuK36bB7X16ZSSt7P0zKp6CoBYylyA6HNu1vgp`"#E
C *
`1655/VjCewmdU3IvkqWKzJd+qEuD9nsIp6vd7/9+s
/b+P+d7e1tubgjCEFO78sfo2iTENTFT89PjvnykHno
y2wMY9Q2vWCsI1whmcK1ZhRmNhxsYv8OU3IGo2Fkto
nHNNXXYcUgKgAC8RvfKKom8TyhMpYA6NBi6goR4bQZ
QZNEEb59tCmauokYNqP9phM7V3avml2oJFS0JJcTwF
HkWINHhMBaCOA4pdrZX6p2BIoGtSPswiPZZrOI`"#E
C *
`qWHolAApYp45mFzH5UHd3Sb577COp24USl1GLxnu9
I1kTllgKUqofgEmh5+8m8GPdVBKwqvPuLmhrWbmuhQ
BN2KRW+LQ0PvTJEvqxB7WpvCHR34U9bd2BOB+0z6iu
Mxxxi8zQQb9XGZ0AARyZE0YfGaKHM/tk6iRin4Vp+X
M+Q1KJe3T9id8yeeLus9+WyTl7bHYl4m9nQ9dqXu6T
OfY58lUjw2HFC02LxO8HLLz5uhxB0M7FlUyxbN`"#E
C *
`OmIenhSS4UdNIQG/qG4+8+47Mw1oqFNC4BrOr8anQ
XvMMHTHQO1TMk4MRLRyfVmZ0SK6lb2SlOjBZRwLHLS
cdYutkQSzjFHhNVo66kUvXbuXTZAO1kD4Wucdn3fti
BrKH0w8r1Lv5gGRskzXJUnSmG4vyi4GMohpQXLzXxA
DMtnhgbtcHGEHZ7bwgkFlSXxd0UQWeDF6pzRQ2YUAa
gwUj6zgpMub4x6h3unNOFizqycQ/0WEknmggsk`"#E
C *
`cl4DIwy6JfuUyQgRl24eYjRzKMWMNijIR7fUdep7l
7OsgqJQyljUXQOHKPwZBWaTvii/nBQs4BHByndCJUL
BMtL4FEQolp4sWJWOSr7uitgJNMwCpIdxqQctk1zxl
jLSaQcUAAY/eZX9zwZlUhfZR/lQEo5ViqJN9r5sOm/
XBseNOdKwIRhdPTBkmFMTC8a0vkL9tRkONE4ODb7Sv
g4IBBHIsy4zctL6VD7wM7KEgFi08TCoTxSwJbh`"#E
C *
`VHCkl2uy9HmiCPPvR/5YsyeWnh1DbAfIbQsRGjlGK
FQPEMXAxN68qSJvvbA8idzHqBjXC9mB67gmrkXxNIW
I6XZ5F8Wp/pvg597sCmJb8YxaBg7PomC/2kPZrzI/K
yxoF92pN6ucb1hDmmyVKfQN1HWCjuq3qU0ajgA/sEl
NTcyaRJD+3D7Ys9bEhOnOCT5TrPNj9nIcTh0iZgZWh
jlBOCSc5gCzdoWAuhKGFExBxR7ZTAO/PTdhnRj`"#E
C *
`36hpldHo6OaGsuACoxU9bHyXYmB2pCUE1jSlMcZIS
FFfK6u+7pe+IpyPKX73iNlI67yHQuEfyNLXAWuVou7
Z+GAPMnRNBYyH0r3aorX+BqUPaiFeZLV0t+WN9Xxp9
d/U+CMHWw8+irNCc/SULnmgWayT8wbvfBAZPMuI9RN
qjHaJCJDPTPPF7IKORmuuDocvinzr6FAl2NXS5dFHY
MJNjCL3a7Y9+P47Y8Jo0RUsyTPtgkZ/GQer+Bf`"#E
C *
`hC6E2acxE95ou4UHU1tX7QThOfM/mwdEh+/MmzrQ6
VR3n07icYlz9DBy3GGrH8LvOMgatVO2qPFuprQ4b+T
9ClnABRVwQQveOGDRvsmj+XgqaAS5uEVHgvJJGaHXT
yOg2qUIAPND+AppkQvC/+mpyAG9YNTBHJswe+MWBR9
P+FNzw1wmeBDiYz/nVS+5CgjrFNqCTajiyxB1N+D6E
4XNkxcRfcuPZw+FBxaoCyIkrDA69KmpWgibGif`"#E
C *
`67i8k3g21xwotf03f0mB/wygtAmuPFqhcJ484szOH
rgmB/fv2M7gpgaq3pf+Nchp/dVGfZN/Ek+yam4KlJ+
iIXATejH6315hHUIHj0lcpQmmkUbRqM480y6lTX946
h6Jj3RVfm91rAzUc5rAKqZZ5G46uyzT33b0yXWaI4/
TUNfxGIKJLBmnqRISRmfvthnrrGxpd/u7nc+rLO9vG
BG52jKvMS284BcIL4hWi6zEi7aRqgAa+7QqzAw`"#E
C *
`K2+WuBJapsqnbwOXbJUO2Uu7kba+JVrYinGIdDJW4
dKq2g7qcFaGunFA5A2lZSyDm1QoJ0iA2MjHaBmZm6H
irR1aKEi7dRYWKXDZNzXb+9HUZjue3cA2FnrEGiWbK
czVIdDrjBHarmsSU9Yig8mW8KZ1D6vCRBcGVUhw3Tw
RpFnlmu/DcyEtFShPovT0AA6+R24Lt/YdP+4kOtgvL
XhlPLCHAJPWnkx5C5A4/62efWtrKbtqlO1mSaD`"#E
C *
`ZTxSzAmSXjAK1lGVk5Fb3iru7ZeEty5wvwN8qGkX/
4z5te18/2Ps7pEhBMWV99n765JvVOBKQDLN4F/RKD6
zEr2JJdjI330zK9g3TKi9ReNDmReCC+R232Faw3Xg9
qk50X245SEvP3t48Ogv8lUFkGvwnBJg0qK6FofkFY6
gxXZdoivBVz26FIPFnqf4ZZ8U2BBe4P86fvnCljYjw
17JsfMG5L0z4+pK1DihU1ZiPFC2u1W0gamW4Iu`"#E
C *
`BHbjNVuRsdIenf+/vfbg7Oz073976fnC2tXkYJ5dZ
Xm4t2Fl+Vp7V5+IeDsKuQsai7tnZ4PfTv0dnZ+e9ry
MMH+t0ej06VJ6Aoux2urizhIXgn06v02sRdPiAcLLG
20YhU9w2+urlMV43SvLs3DCKQHSZJt3uq5KFOHc1n7
sICf4gKMcqOUFO9gx1j/CRERLCzDVgZhrO+wq1uFb0
8PXrl6/Z0Qt2eAwzgNeHJ6+PDv968IxtsYNnz1`"#E
C *
`6+YY9evvzL0eGxEZPnqg57aDTdqGh2uGv7lUDzVaK
Lam6sDRnKAXF1cQM/nW5GPY2V6xHIHZ51T8/ejc42z
4bnm2e94VV4GcRBuY9chw7YqmjGgegDqC0oqOXs67O
t801VBf2l+wN9BnjXEkv5FdgtDagv7ul9kH2EXWMSj
fdzJNMNvMXVqdfqFs8cfY56w3f0iUv1pDiDnC84DbR
FpqJ67l945bY0mi8RxYgRTGOuWngCjB68O0wOF`"#E
C *
`bzc/rp4N7xOpwlb5FVR1jAfxiBLfpo/TzAqBSfHdn
m54qxsoAyF5kceMBjXgudyJNaiN2zgQVqN7RQ9kJvQ
yqLuWqcedqvXEQJ3oltpdQ78PCd0pL0Q61DAqRXaZ3
PFChzuoPY1wt388MJl1RGFq9Y2yYoqcaPrGlZJDWHq
XhYZyAWtDctk6/wpz28/YqFwGDGiiLy9lK7OcGh5Ka
+//O5qgPQ6SdHf2DmcVXbvNGK3+6QBudkX7V2g`"#E
C *
`o5Jx2OLJA+WJqgSMLFDfnV08FSe95AyMd/7lU5yhM
Z7BWFJcQJkFAeMzifCEmLEOCYJ/DsJH2AkjvQjWNdk
TOB0AvTkWZyh/GOlpo8S0CQ6shHAC/1bFvLsU864XU
rjOGRV0m7RwbPCrxRNzV7QFmxNIr6Ta3q23ClzXs4y
WijV0mBMIrHuLSmzK1mt/JSQDNo5QrzsEaBG0i8p5c
6hyY8xTpJ/FQvxl+HSrcNC90H0ZC0lDrMdDXuT`"#E
C *
`TMdEhYRkXg9XboW5V+p88CC6k8JruEyvEIDdtDiJi
Iy3D7/fYtroM8RZ+8Mq12RBTPIVrYzQyYgRwkMgsyL
FeMsGqBnjB4ZKr1mT5Aade3LHmpNqXqxFqNBoO1Ekx
D6wkIfRy1hGH78Upl1cr71m6W5aKYx6GfQvk1gHh+2
HB4de2EbnS3txyOLEPaTZrjV1I1eZVqPHZsBJt7ZxB
PWLvywrNEt6MNTL9HVhq+neD76i1cZ1eZElzQ9`"#E
C *
`1qWlrnVXpfMZ8XlQrbYu6ib3CE+rd5BnCOs7pUeJt
9vxYEUJWPYGlbrHqNwQtZztiVcT9cN5KSgV61RrQNA
rqEIEyFKGZlAtCIJuJFXvG4ICPOoqgGdFWrX/u+CXP
rw4RVGQCv0sUWNw22cNSv7UgMWnlpb4ddLgQsfvDhs
uUiJHZvOgW5ajQbGe45s/LP32VN3GDyoS4nruqzs8Y
UI6Oyj5Yf87rci+dxmvO9hqPqKE/xhSOmDuoHL`"#E
C *
`m+2rKVWIGE83h0s4dW/NbdqvGemOFVqYyio9Dcaz2
lfF4C2SsqbdJKMZ/F8ydvbFmQTKQaQTU/rK+CWS9mM
3Dt1uyLqnWaUkK1g1sK5uwLO3Y6j17X4QbYc81T7ns
LF70xWQx7XDoyfszR/ScJOAT8wh9hj36vMi6tXRbXH
/vxnBa2u8DVR6Kt7hUt315d07H4EHS4Zu7vrkiGviQ
6OPWIr/Ic3m82M+6Lvacs1UjKoJuIVjbmBAW1P`"#E
C *
`EEPTeTpaCRqn+WVBD1NDxnyH/u72vvyCqqPjdSNur
9JLekp6sihRuR5jWTnluBm5OaeEjO+fUBuEJpA+OlS
P+9KLOpk6mBoAiMKI30D8CnAnZX1LBwK6nGBd081IB
cHd8GTBsJsGC97SCUbvijkGT3bfqXOGIKA4JTTnA3G
94sxZ/hWrO+3rQ4TCOaNO7xfxSXvzHS24SL/sLixEK
IeN9kkwFYyJHCkv+DXhxj0l2pvxC4cOTRLNLac`"#E
C *
`ls5TzgODMI5J0aJPnEUzz3Uz8/SFdqprHOS8YN5c7
fnXwghdl8mN7FkbzBELTR1AV0lMcdoEHASlwFZW9SO
/VuByBuYYu6eMru+9EKKiDdEsqKGfki8L9CCzaNM2v
sNsj9WsLH4GLepsrFSU1apQt6XcPr4jtzN8HjsnHS6
l2SnJJWKeEmzsK6z9CfB8e2AUbOCDXKtZSJZZV8TTK
iO3ogBczV9+X/2CkBziAesNaBsi7Fz/IWw+ssY`"#E
C *
`t3bYWuJWkjYNPtnH27uHN8wEMlL01zivn6yb3YykS
sXNBGRu6uw8hNV6LW5WxbRVsu8qZLflqR/MO5rr6Yw
y5EEwcU5oyPaqMhI7bVKl1yoJsG9ZiWI1cwq1hcLtv
iiZGOve3C8ewI22TgvbfVVVbKqmH3U9Yg/C2L7RZmw
4CFtdkqnkW7ltRt5Ktmx3w1N7zqa67hWsqG1BteVdY
mAPLCMl0RTNZ/0GPVnBpZbOCShvebXNFroTBRS`"#E
C *
`MV5584229bGwxKE0Ku3Hb5JEiixu1IJZ5a8rrLnQ9
VT1Lu9Bt61KrwGZDv3ZOMW3SjwDfvar4mmZp5X8DmY
Tb+yJMztNtmyA0bXbvbup2y23YiPa/e9mxRuzR/SGH
fELJnDudPg/85zOPJH/ztM4v41d/vX3O2fZO7GtzTC
kzdjPH/O2Rsn4fNO30zV9Pnmbz4zWyZwK3K3taqPnc
IJLP941t9pub/3NE7uzjXN44Sc/Wsi9xETuT9m`"#E
C *
`wiV68nPMuEjP/mvW9SlmXZyV/2VnXlzI7jn1Mtv+T
zT9Mpr1//kUTOjgPLxB2rqJ2r4xZ+3mm0E1F78+4sE
JxxzieTxvsRZ26IBWmzzwJRSvFarAnXlZVYeVLujIL
R5Ksq+Ur1v2AfpnPsIdXRu/i2OV6m5Fdbe6Oq8w1Rd
AKSoMtdxx3V1iTTFsKX4trz3xKlcIWkQhcPhY1/XkY
44eryoJVIkrBLLmNfufF9NdL9F4vb4Ev9PhNlf`"#E
C *
`aRoTghTkaLopympRo2kdNgQICcT/isCfFnByRSCZs
1cV8ixqk77Hoarw9o01bI51u+iZmsw1RdRjk9EpIQH
mJsGyahRyxdIq1SKQRDRQUyjXYrws5LWkTq1ZhRRjf
u4Z8FV3fRp4RC6UF1yzsHONw4/rNOEazlMPxzu63pv
3yY9Ssp7b1tUlSOlUWx2hRuJ5gq2L3Fm2HzCbxdlsD
Ir4D7qPfSEhWstHIQLdYsMdfGEcq2jo9t4PgeO`"#E
C *
`3rcd+s6tNy6bvvQ0z67nvFI7Pq9dl0Ucb50Sy+Stw
70wQPH8r8NgYiElw/GqcI6QwdjWFDhbWqQeJX3ySoC
k3rempf3N8VqS86stXvArtyY43U7YcHDqh5P4ED2oj
VPEMf7rbiJikvM7x2z/Q+QwWWSTN/BOgTiEg7ob94f
nI7/N8QPl7URceU+WUykspLULSyvY6rsboprdtTYb9
Gt1giYx3rtKV1zAdiYLUXZy8rIVzxuG4z+R/uq`"#E
C *
`7Va+1meUtLOg+B2A5g9CW1Dt60aLMIM9YqaFQEut1
8agjFbrZh3wKLB7IfsnrjDb5nrqHyJVrMo1sah5cZC
OdhEqVlEW6/laA8emMDXaMcLNZdDkPAFAWmOFzEjlO
qxj41VR5ROpDqzr6rXYHhffuMLwzZGBDXwmertjw6B
J3ruFwDfFvxOaD9l6DukDyhPLGMsOSa9E/UC57Csvp
NnIfiVsURwjrt1ThcGoZzwe7vZfv5HhOfLdu+u`"#E
C *
`1u7dP6Ldu0vavWu3u/XsivOm92c8XDIcMjrfnBVXx
eUlw+dKsco8oWv34vJ2BYmnovTSKXTVB5O34qAn7qS
BgmPWLUyr4Vt200KrgVQdwAMIjCCG1lO9SyIZN2gzS
i9TW0hGy5HwFVrC4t5Svk4gBPsMsRCsKRyCtcc7sPV
DHtiSqAd238AH9mkC2NmacRDsE4VChOpdLxrirrkJ/
/Ddf9aw+yt3cNIVN4vl3lJoU3j1Y0TmpzVIsnn`"#E
C *
`ne9/D5d/n3vzUZvtG4UfU6vxcYf//j+bkH8K4dfnU
/HgnW76Dz2yfNbxZ07RN43ucoT0f1yV1jiKmapZx7E
yuwvX5665Ny7K8hateA2TN7RpJa+NEYI+CJ3GVLs63
UUp1GnaDzttpbvCdWu6NcudXh8ePDl4djk9ejvEFaL
yy2vQw4CfdJ6ZCm9BjkIl8QUJM9OR0X/ykkpt4A6S+
IbJ7ehadfXX24OyHs855Dy+ItCtHSCEPTsaMdq`"#E
C *
`Q4WZ2os8c6X/22KOr9Dj+82fmKkuLZXKU8oJRMg/x
ACVc64axDKX/65vv9TqhOIIbp+zdZN+6zC8ka0Uify
tMLeo/ookEqLtMsg16ajadJHadZhfcaS5z2HcP82S2
6aE9f0Sd2V40r6S+hC07oCa79AJLiIm8tTRfaawfdL
lyndSYuf/ZL8me/ThAkfLFuEFcLKQZCd17lvIyqrkY
fz+iR1DCBmLcKZR66FhrdqF8bE/oU/BbZViQA9`"#E
C *
`rCY3r6SrxUw00CZgKC+iuwGHJDnwrhFj/kt9pF/63
VVLEpQqKCSoAWNbbWg9Guu1hVdysa2FG1bkgheYd+G
aCmJDa8crtK0T0LkkjvS/QvJ71vr+reat7LEKfMR7A
jfd97ACiW2xvC8b8Uursa2uoAt488aVm5TfPB5URnj
tZEAXLpGUF8DdH7R03xyAOi2KDAXjK6VH6jf/Cbu5o
XIZqoMcYj4DVdRWCmGi3k3osMkWM+BGZ8Er4qM`"#E
C *
`T5Adb1e94kFbA4DVcTqWYseXD+mFUvd1e4VZPuR9H
8y8q0KoydNh0QP+uiLd+s33daivRp1oUzVrM+qwdOo
lEW6VSlRC8g8PhoTyhzPjVj3R70o+NunNzaAfH7hul
VYuiEdpvrTV3pzH7iGPjcbl7SuzfinnEen5vbiOEXC
K2E0mOe8nS+7LHE4qZn10Dxh6YGCOafXdXyYNO26GC
W7w0FohbKaykXG3+xLnoxWt4Y+1wjleSgvkzAA`"#E
C *
`Ib/KEnxPWb/jxRT3Mwh6u+saPA3xdu89mt6+Tq8P3
c3puua5q+JPOkiydpbUJXZ1UtXa95IvLobeW3VeW1b
DxY1NUTdDI0PPJGMq7vb0t3nvf/VYTsGG8GZUd10UZ
Xxl7tgbZLPAIg7ZBBtcq+0VMV13YKAO1I9VHeH/yKt
hthMDae+EcQ3dxvNvNaJ134GSOvX2XVi/iFy6EOseh
3+5UeDdELLuT/EB3qWXQbO4ZXDDXTaQkMnoZmf`"#E
C *
`Ef3ejs7Pcf8ZpRfHIjSs3HnWQB/rSCUUdgGz98eZd
RJvhcjDNaVC/xEuJh4d8lTc0yI0ufnluTIf1OsgPqP
JTM0dWGmChINMZqteDN0eMhXvMT6Nva7FCrb2pbTGp
TNuRwd7rWNYUu9cgYoCft77Q9WMH/umXx3RHTeNrdZ
HIHuspcBg6NUF3k1yLN/a5SVyp5uJ015lbkahOiXWn
Ys8blWkzag2V6y1LTraJoK5eqXWGF0N4LE6mpf`"#E
C *
`lDBO7dsBV7v/AgDV70s06s0jzNt5D65BfsnsEXuMF
Rss7Xd/vo6umnQVEpjaecjioLjvcLOCdBm7za398BH
DqVAB3zSAdW6kT0HTsVlMuZb411D6JP3E9ttzKfjX5
6+Nt5p6fLnF8kOurwlA1nMbTaKMYHPajPnxW1K2xDr
15b18J4CQ9BBGadVcniTgEGJYMjsTYrZALgyL8oaDN
CesXgBXf84rfAh0zdF+fZVWdTJRGTYbxAx/TLY`"#E
C *
`+4l8SGgZ/+gRUxFXMC/mi3n3N3os09hekG8AgQNcP
U5LOrLjhGG0MMbIwlH3U1ZcxJlA0xD8pKsJlPJjgxS
459NwyjvO+1uitZMiv0zL2XhWXemXuKaIaSSXV1yxX
hVfxyVRMOE3/lLpSCpT5w0ymBp2vupsEpSJoeVtMf0
0nAvkPQVoDoZJmWCUntXvAiYYTikGlyEUoMegES/eP
Hz0iBQGGJYYTb2VIg4II/ybNOczxKd81q2f/4U`"#E
C *
`JzPy9eNt3l76rl3v7uMGOAJRcAdVJ/ov6DcPTyfub
/B2tOhGy2/Cp7I+H9dOYILF5ZqAOL7e1w5nayO0yNn
Jo91z4sLIP4Dk9dxR4iC/GRIf7+jpCxkXZHiwDrMv5
KpNbzomcERredGE2Rg5XNE7ddfxhOG6iuBl3JNpddB
IVafMcigkA4xDexRelByEj59KqPk0Fui5tjf1oflod
TMGFBsShRCSODu6EqBHv37EuHuhsCUQITpDamv`"#E
C *
`wpJxFR+zR2TVdHY1M6cslDztV1wg/ABp5xFgbG2Yf
kmyVLbiKqFhczHOKccdGyGUeT6bAj61t3hiik4Bkhe
F5dPU5jQGY2BstveGcTcL2vKvE5dPWeaejoMxFAB+w
qPKYWQ6PLMDVmuNvDl4//FvUo2Kq7bYf8Fd7BT84Cg
aUbHT15ffD80FCQhTj6l9QHNRj6i0UNNaRT7PTWtjc
VRZG5d2FgGX/KcglcHV8c4VNMWNH2MqREyEM6z`"#E
C *
`bES/IUCzYulBFMUDLpHYXDdrQP+fP2j6zSbdgvz6K
ypGETAii2xTZ5OGNiQ7SkxvT0WtRPsKPOslsLiP9sW
8aelDMFvBEb25EnUPBZaSjoPWOkQVqYe9gmcCB2yXT
zJIZfCNH7juZMeQuFFCJHyw9iaAXMu3RkPkOME+m6F
Z8bc8qUIfmtC4MLXFJ7VxIbbZWyQL+d4fGgLxr4eww
ikx9AsecOHKJ/uLFdgT3fkQAmFG3MsDS4Uz8R1`"#E
C *
`0maNsLXjmysqt7sCabtLSdttI233nqR9swJp3ywl7
Zs20r5Zg7Q793WOOR6Jq7i/gOKmnmVG5wRL0aHRxeU
lGbAP8kkqEScmCIHK9/SDztO4jvtA2mWCa9HayaGG4
Z7f84OTpwM8lFeYB4p4Jafp9BxZBjisYSt8C4mVP+I
rYgIsX7Tiq5bFAoyi38RBmcyKm6TbiTbxfV9Qh5Eml
X1NG1nuoo94tYGxK6uZ6dRdcjSasG+X5LU2FLY`"#E
C *
`aflOkU9P48yfHA5jxH+yNu163h30yHDKccLDLeAJN
vYXJF1gvKFvkMAXO8amsOiWPjcU1zIHist5azHtcFN
BRG8uCZmigPpgG6OdlegMaCDhMucah4jEdj6TJlHz4
m5LnMZ3tpwmWAZ4VdH4eiliVUYr1qrvo+w2J/1SDnN
vKOgQByOl57khl0n65hqD98nN67pxIukyzpGtnD36F
SbAnEKrDQ9WKsbbvNhixW+3FBLe5CL3i++A/He`"#E
C *
`Lz4JzHm0wha34s3N5wouQ6rhcVxZdvO6EyooHu++F
t829RxN839FjBV+aWd76WLTxjoqTGBA4oiS6H6nEdI
VYB7dYNhwJtWrE4Z4KeDDzvMs4YaGFIrJLscssYOfk
VU0PKbzXH57KniaiG05YOWRJqyBNBYcIMNcdnoEs64
YYKyRjbydQni7ZzBNdMOW7sPR1kEe4/XGGs6nIx4a+
OO6pCdxs40Om8bjj6Z1o/DuiccDIVB08NmUZRR`"#E
C *
`/OiDK1BcSCykeXEW/8QNdlQ+0EY/Efv4l4lOQrLGW
iIfx8aM2mrciqJR9yXUAGfsVGLvzZh7mmpT9uihL4H
T5tqCYK6fHGRpRNHlTMycXTQd8/oWfIM+RDp0/dpNR
O/fXbbz1SCxkhK3AgKL8i7YAOs2oL1OCVaEypocie8
rAQNRxGiHYJ3aZaxiwTGInzB10ZTGlmkZpIp6dOK2c
VV2ZE9TPgnvIxGFkhbl+jXaucb5PClY1lCTDQY`"#E
C *
`bysz5KCRGdzyUR/avqBj5ia+wPLXUlLMfg+SowFWI
OnxsUmWgXsV0ly2Yv83cVSeaYBK3QHUtOKnR1PfHBl
ZFc/TvbDS0xUZJq4bUZHI9SC4SpWDVOFDP+wRrescz
NNKYpciZzhpAzlOu5KAv/Kdlr3/GOxu02dnR5D+LLl
Jsj356xXt7UnoaGewDU4EjAt0BUAhgJ1Ir3LU0QwPM
4HTz2NIwSBBOtgcYWMe34L1TScnxXyP3A3CcSr`"#E
C *
`OP41wA4zlSQUm6U2av8wPsjSuRgR4zsv/fHACgrWH
TXhYFu+gYF9mSNqMPJGkQF7BTBgMwoxg5A+Ze/QKI/
agaRHRJM4WjHb67GdANdrus1eArgCtgfckIalE052I
kx0/Oz54dRTiN3UlX7T5fw==`"#EC *

70
`7X1rdxs3suDnm3PyH6Cee0IypEhJSeZuJDNZ2ZZj7
fi1ljLOrKThaZEtqeNmN9PdlK3raH/7VhXej25Ssp3
ZO3c4E5kECoVCoVBVAArAdVyyRVl89+2kTsp5msd1U
bIxi6K9L7+4DuRN3pXxYpEEYKqrJMvgb7xIMHMep7k
NMC3yOsnryUUZz5NJOkMoK80Gv07KKi3yyVVcXfm1X
SRxvSyTCnI+vEvzWfHu5SLJ0/zyTVpfPSnK+S6`"#E
C *
`ry2VyaxXigJMc6oJy/NcQf1lQs2K6nCNRsxSbKX8O
L5P6IEvwa/Xw5ji+fAEFu52nx8+fdXonW2dDBP/9dw
0vfkdZXUZ7o9H58pJdpO/ZBTD4yZMvv8D/YaXJYjp/
WBbvKmIqJwGqmpzztG4PiLtY5tMamBHKZh++/IIxll
6wbh5fp5fYS8PrBNpWsq++Ym7aEFqdvH950Y32F4ss
iXrshzHbkljgUybA2Jx9s73HRqODV4+eD4/2n+`"#E
C *
`y/PtwjgFuWZFVyj9p+KorLT1TdEtq9f4ksVtifpGV
yUbxvRL+j0T9/+X8Onz3bvxv+50eHB43IDdwAZiF2Q
bcU6MvjpwevBeyXX9wGpOGvfACEhEIOjhXCocEMIbH
kbQyMNxqEFFCbodJWfgjaot6eLIqoRdEx2wSkqsUSg
nOaQPpj9j+8DnAI27kXYUoQPh9h96KLC9C9ifpOSYr
M8iXLgBBpi7iskidZEddB6a6W51Vdgs7kpPSQP`"#E
C *
`EsQX2VxDepqbongQiQ2yZ7OD2omma1Z8wYMxeqh9e
J48urZ/vGTl6+fe7xYVcPzeNqsePTg3X/UXMWKgewX
JEY67Jlexfll4hnCbjqTdDVbyvQJ/jicTSLWZ+lsT7
E2YJ8e3hzOup00B05Mk4ngDJDR6aGOvlOBYR2XAIdi
2rHI6hisvB/GhsbK4cfY6iaCK5KlU0I8ATGfrWigD/
5xzWvB19441TJKr4ZZkl/WV0HlQhCr3ZBUUA2O`"#E
C *
`iKFkMG0I8sNWEKSBhW+0ArgubxSVuqwAf8P9qvWqb
Sq9Hh23DLg/vQIVDWy7tYaeP/hKcBmhNCFRyol4jAO
smyfv2GOA6PZ6yOPjFKH0MAt5XtJKgSq44HaHvSvKt
3FZLPMZOXrn8fQtO1/WNSfjHDruI3t3OM2KPHlRzJI
uOrjapDRKqeAeCGeZ0HB8dJVmoHQI5+AOVfdM6V2p0
faaOiKezQ7AO6yfpRUUAkYW578OWH2zAGIuctN`"#E
C *
`qQMbQhTbGRyi7K/HAfzEobkmzNhRUqq7j6RUVdPHp
nG4EDg4oW0VZq24vk3lxndyhYYECDi0hlGs1b5Y0Nc
/IWdE8c0aUIPzzOI8vaY4iW84HkRpGk8XyHNQho2H/
4XZPZ2SC+srJSOkr/RSFh2WcVrzJRkVo3UlU4zqeQD
OSqdkubPUGMaa4IEAcmGAxuW8T8WkJKBihZH8AL8Ao
rUy6VipqROnqcIgav2BaJ9shCBDV66aeYJ1ngh`"#E
C *
`RejEhxIUyyLKpQfXTTMTga6YOGQntpv28XQk46sCf
pWddknKl6b+02Y5Ps3kguEVnp9wX+/CP6oJW3G1hFX
JbxTWRjc0GB/pMzH7licTuHbVPHPELQDhA/nJ5w2uT
zO0DpcLGsrrqEbU/1icIlO4b66ZbMU0AVgSL/5elry
/8Wax2/PH/2tK4Xr5PflklljqHRiE3BpBBHDg/+oz9
gYiI1YI+uygIH38tFUsYDdhRfxGXqeMNkPG3k3`"#E
C *
`Z6tmxqq+vMA/nwXQrcPTbpOfnlJUgs+fDoti6q4qK
kRx8evol67Qq6SfDYBPhiLV91pMZ/H+WzAYBJ0OAd1
9iTOMrTRJq+4uPmrYhuGPIMCcPMNJ26rZ/W9gVQQwC
XXQCbSNQ5CIqEBdv/hy9fHEccHHKySuAS/B3lYHO2/
OkqmSyZ0U10w9EDrq4QdHh/Bz7dJTsVMpw21r2W0wz
4IORBhH0zrEdLkdaXw5Msss3SjXRE2HUGs0UJm`"#E
C *
`QrVkbNPmuIYKDPhm1SWHp8YTqgqhDGrbamriSASMf
fJ6//nBdmSpU0GARh9sqxj4RmtVgTu01FQizvc/mAk
7/wWY0EQDyR0NEVdwA1iGPyX1UVLhwtcxFvEbpFA1l
um6vDJcN11oUnFMoMSqaq1qrBItLGK2SaUyvq3m6aa
19mjQcyJDBaoVlx8jjnRzO9DrvmrtQ/U/RnsupGs6V
mD4KoDBTQgW/L9HB48mRwdHR8cv/3LwYoxeMef`"#E
C *
`AOrImXCeaiMI89MMtqOd4OoVuQFW8zshi7+KKzZI8
TWbKNQbDZa66kT3X1mQDfhvWm4MtisVyEbB2WuJMo3
QrbYK93tBcL3zg17BYgBBHPx0cRwOPmfakxBI1Kvsu
ra8elQk0tU4BkCwqzJSTizRPZiAxIZgx7ePYJOQwlZ
/dVDXM1vkE1JqUfKBar9JqSGBHCDYef4tyTalYbllt
jHe2trw0MLpxlpTgbzw+er5L3DiiLOojmi5pcP`"#E
C *
`gVDU5zlhc1i2Fqj/09SzLwWkr26vXL777dBCQ0bwA
NeWs1AZ2TrjWfNhYyTO65jgqNKpr4W8OCbPD80rTif
L1DaOxuBLm2noaEYVVOVW/rbvSg6pssGV6nVXqeZml
9g/7IVTqDLrIGnKr5vJjdDHGXMJ+JpYb5pa46MKjXl
d9bg19Nm5YhV7AR82qvT+13rvD+JFyzFyhccBo/jbW
ARH0liCM1JD1ATH+0rOpi/hjEibKSHN3on18fP`"#E
C *
`irmiyLHTnbR9gYsmpxncf4WBmt0laSXV/V4e2tr8C
6d1Vc4AAZlUqX/icI7yJKLGpO+3RlUIDtJ/ov4VReL
8ZZI+9t4S0qRpTpE4y5ABCol1/7iXGunBZZU+Oxzss
xxdXUCQ32WyS3P0chZauPzlF32PAVrm18yXojR2gVL
c7HWVg3ZK74OB7xdZjMavDfgL58nWCitigxGzWxoNh
EUuhqP9l4Qbp+hDhHNB06RpyF+Vkl2YedqZ2pW`"#E
C *
`4AY5oTCg3fyepQvuWrdlerF2b7Es4kwC6TDUJ84T7
LFc5BwOelbauW/B0N1a+iRcwTlMIsvErya5rnlNNDZ
/zqv4OpmhbD+kAj/z+hBKVfmdrFL2h9B7ME99g6wUT
R+wAuY+5dG0TBd1Jdy6AfTsfsbtAS3Pk6GCVPi6NWA
w3+TwovBTABwwvpb/skwv03zAsrhCw23X/w70W9LlF
KguED+pC0z54R+Bh0m4PRdAtUfgWcQlsNQDc4R`"#E
C *
`Ta+xAQ73C8FEN1TW1LwWDAoE+FDsMYXSa6Qp7A66K
IKNeCJWxLGNidZZkvGJilJhFTtIzrH+/BsV9vqyTbg
et8Wb+7nzKJexxUi1QupKyI7xgtK24msTCNfgMFu5J
A/A5QL7FvULQM1fQq+giFMPhMFzgNpAcSiMf0KQjIG
f8oyS7xTVo6wsTxRBtJKrsOnlfj36Nr2NRcmXByuyD
qLEP0Epx/jdgHI2apJ4y4Y85ZoFUMdiGWcG36Y`"#E
C *
`ZgWepiWmRoUUcjtKMeyFVR+aNNVqGN2jdNQuhTEX3
dxCJA2CzJhloZr1QrAa6nOahgjE9CErqGhhc2wtPWH
a6nO5Y54Av1MCbFkLS2LPlgnCXny8vLpNzjeTjqFsD
E5zAHAtdVo+183QF1Djr8tgempIkn2kH8DC2cc5o6r
iki+3oNdhdkk7gtiQZWr8GB9Rq+suUrtBrp04u0rGr
yq9ukQMOnOfgLNTer3ZChMzHes0c0LtPtV5U1D`"#E
C *
`ee11J0Ycd1km7uRRq79q6nPI9Hnnvvh9bl0h3qs4h
vAxbLu3sszGoD3D3/sHdpb0y3uJju8PdQInFWyOkX/
FSfAUC8M9yx+n8wY9wS//GKFTxzeCiAk1mY3ajexuW
5pPNrVUe4c/gK/g0y5zB1WC5j9daNh1NOABCTnPLqY
GBwaDpRXAm7MlOwH92givZ4x+nv3dPb76bDX//fRsM
bdA1lpT4VG6WUAWnoy66WwCQ8MWzuP3xMLoNYd`"#E
C *
`XViReWKi2WTbtJUTQf+rcn3AHa71wVhBBSq3Zkee1
28wqsrSadLd7g1/LdKcmOss1xhIG1cKBKT09ZjcFLG
EYC8gaPeSMiPml69s4tYibu1SzRfgbh+T/dsFVnIJK
M7zw5n+iTryIQyfVzGozWqXe+iUA6XMDFkAZqlFdg0
TtOcw5dXJ3Mwep3VmJM4FCDAgPCaq5fkc5DgHOHNgX
FCcW+NqNw9v1oFMsp+waJHNJtdxtqRw5AuKPBN`"#E
C *
`2CT2/zrRYpEkHoRiH2kVh0qig39KsGtCWjQZic5jv
w7QUGw9TZbE2yIOG5idRFS/Ih9qEDoXsm0laJ/PozA
kfmgOH0hzJ3sYYl0CAM65rlHUWsR8FewB2CP9Ntoe8
8LPkoma7DZmvcUnB3grSVe7ctcqdtip3mqsEN7SAzi
kuLioz9irOpkuczU+s/MZosghryWIQlqsFGoHe8Maq
RWVN6uLyMkNN1l0bGTYaxbwtPs0tM5yCb1q9oB`"#E
C *
`guubDOq56I5TdCu7l9F6R3IiA8d1tmkGXsDfzIol8
ihmPO7hZTMvnAaBTbIcm8tW5sii60cgtX3UzZkml25
8tUt7MMejHbrL0xAgPbMBOnDzatpU7MwYXrsprCyMT
8iZcPIxmjtP6KDfNaj8rHa7VoeBNt7jaIxV6wU53ND
qqb35Zp+bbaRDX4P78ZfgdmLUuuk2ybYZ0weaUtiRh
X3Dkac0/DS3HrEB+zb/omJ/qenuAl22GQ1r2WW`"#E
C *
`qkT+lbvt2LcWaPWnXVrteRrDXiz39cAdwXVLLJ6xK
B7ZiQHV8qbJQ8dEcUEy2MZjUjEy0xpU4yoBhInkIYG
SI/00UipE+1QgrsHJQFWgaFZFJY3uO/x3hh7lgnFxS
RlX1HApUE0bKW1Svp+KBx+pTU7P+fVIpmmF2kyo3Ue
Crm3VkevyuIdS977DAwvTVvcgO9WOKl2DDgDI6EbjH
Utik9PhGoNR3ORpTfBcHZJzW1UWFgdSFZgZ8BD`"#E
C *
`xGO0+ixq2ksIV01FjH1WU854Y6lczHnVx11dHIZSD
oSfCr/F4YPu1gB/8AZBpzTuBSTvwR3N48z03nBR91m
av30E4zOwlSPmg7IkcwLx3GzDQIcRDDMYRKmJxuC+N
XpE76OCwVEgdzhdCyGHy4TvKxmSYkjzNS3Y1WX2l+T
Gi/UTNeyYpdwgCBmUh+4uTHIV7Q4qmhcBzFAfRjA/P
q0COBzO8IF5GFQFyzz9bUkhRKGd/VBVUVZtand`"#E
C *
`5dzSK+jYmb9/f3fi3du4FiaPRu4RVywXMRhIGX6/i
64TFjNdqFQ83vonp1LVcVMIiZBakhKFoXNJ1ahrgrI
Z6mX/z/zP3Vc3ttj1LfzmDCfDzfZmJqpiPJ/x7OBuw
sihq/Jc8h8OZqd2mMUziM2NjgVmDDo/EuCPNyLLiew
FKEhY58xZQFPsY1wn1OMXA/Szz3WkB1iReDNGk7RY5
X916IRqDjAmkWZqSJAfnpCRIl/76NIfYTMENVh`"#E
C *
`weiL0ke1mH1DopftxM2oN/Hij6paoGLmxwzkG+G7R
rsE+WA4VL/DkviiyJ88gbKqobxBfwaY2yQdE0dTWF5
QkUoiuNnmrkSZlt4nFcCu6xg3tXlggbLdUMK8hj1dG
ItcISKQiNkn2vnpsqcfCkKqeu1kWbpKZcf8KzY66pZ
dLeaVuGB+m2BswtGw64Zkzv1HpLjazrVaZp5XWibf0
T2tbVnLfqx4XJoPW2JcKJMOEhnsm8sgOpsYxQE`"#E
C *
`XSCirz5jiPcolhTN0oV0zDXfHYYufQy90jex9fy+P
CvoWpCI5tqkh6bP5YlpyigESCdwehwjCbc2zSCaLYX
mPAvysChad1oXUTUaOAQx326I8AxurStBfMdhSYKqi
T7aAoAR4ACJvdHm9XVGn3LjVVT1+5H7Zr64/uT2txu
QbCv1zA0Hn9dr5J/0OhN4P9iVXa4XMxwlQtSLspiTh
cmTDLwi7nP5zloXlSO3Z18cR6nsEbPYpQkQ0HY`"#E
C *
`c9VSozwHdabszpOUlttbKkO5d0lfp+5QldiJdZm0W
RMqjTCehIqaMK/BYRWLg9OrHKbx4HC8pNXwdRfZ/Oo
kSpjYH1YH8wVF3FkG0gVdZrjbRVBJ0jAQfn7WUJcaF
b/yUfErjAqOUA2LXwPnjCwCxBDhxU5+PQtWxNr1DPX
lVpOqCWJJec8vs4k0hYdNswpdGAvykMZZWoF+onjGc
/C83/rxw9bH7hDD/22jUxAqVzPMdUgYJY7YmLo`"#E
C *
`U4yycxV5w8hrQYbjh2vh4W31t439EvB4vpmTWi2F3
Pl7QtfVZYzB25GDsrGewgx8l1m+5WL8FsabhIYX6bZ
tQW+QK6cbSJ28bZVt97mlMw7g+2sIGP57ZDX7aO7Il
tyWrKaLf+IRHaF7knkVYp85gejCRDIo5xrnWveu4am
zdnUaTT2HLkgZb7UhZF4OIqWh4dQAHH4aaW2EDH7E7
ClOjp3yNumkTyN4JwTJ0qFOX0ihEEEJn2DFqQM`"#E
C *
`WvgTsdO0fuwJjpgPDFm4ePjFSLSpkYchhN0hr8RlI
AIgTcFAabThOR6Va2zHIAr8GKpmVguzW4MzTsNDn+N
mA7Sfyv0zVGm2TfbMq++Uj2jdm3Pv9kb67kHsey4fe
C7HuxZeYVNPKDldyKQ9Ir91WMLaC1dnJExS0lbGBBW
Agex68BHP0SBTZ57rIl87l2VrxDu/VkWhRv00Qc+ac
W4Mn/m2rAFnF9ZSql5P0iLZOKLgYwliI3ENq8v`"#E
C *
`wV+MhXHw+vHEthN6tKPPZUsV2S69ENdBdLvIp6vd7
79+s9b+P/tra0tubgjCEFO78kf46hPCOrip+fHR3x5
yDzCZTaGMWqbXjDW8aqQTMFXcwoaGw372L+jlJzBaB
SZbeIRSvVVWDGICoBA/Ma3fappvEiojCUAOlCYukLE
K/UjaJIowjeD+qKpfcTQj/aazt9c2r1qdqGSUNGSXE
4Ax5FjDR4RAmshgOOUamdvpdoRKBrUjrALj2Sb`"#E
C *
`zSKmhqGYf1LEPHM4vYrL/bq7RfLfYR1P3SiUuoxeM
tweGMmcssBSlFD9AkwOP3nTgh+5oJSEV59xD0Nbzcx
1KQJuxDK3xKGh92dJltSJPaxN4Q+P/CgabG4LwL2mX
UFxoeOcX02CDPq5zOg4B+TImjCUzBQ5njsgUSMV/Sp
Oy7nzG5RKOqDNTPiSL5b1gP22TMqbI7EvE3s7H7pS9
6yYzrFPh6keG40o9mtRJnhBZOfN4eMOBmosq2S`"#E
C *
`GJ5cwD8/+SHCjprGA7uv7i7zbi8yjVyqwz7gKs6vx
qUBd80QcMdA7IsyTg/EpHJ9WZnTkraVvZKU6zFjH9c
Yt5xZi65xALKMOeE1WjrqVS9du5dNkA7WQPuS4y2fd
e2IGsovTDytwu/m4Y2yTNc1SdKYbi/JrfoyiGlBcvt
fEAMy2eGBuvgcYQdntvCCQeVJfFXTtBJ7zXavNFARh
QBqDBePkOCkygvjHqHeyfUYWLOrJxD/R0SKeaC`"#E
C *
`CyRyXgMjDLol+5TJBhFnbh5gNEMihYw2LEg3sZR16
nuXvWxyolDKWNRdA4dg+1kFZpO7CL+cFCznEaHKd0v
lMsE60ugURCiVniRX1Y5Kvu6K2Bk0zAOki3G5By2TV
PDWMtJpAR7o+R+MwvbnizqpA+mL/OAJRyLFWS7zXzY
dN+1DW86c4VgYip6WmDpMIYGN6cJfJX7SjIcSJw8O3
2NXBwwCCOZZnx25ZX0qH3gR0UpILFpwkFwvglg`"#E
C *
`a3CKGHJLtflaHPEAebej3wxZlctvLoG2I/3WRXws3
bETyieoYuBCT15bkRfYmD5kzkP0DEuC7MDVyg8yA1i
aYt40mzyr35T/bfBTzHYlMTXkxg0jB1lRKH8tAczWW
Z+1kTQLztSb9e43jCHNFmqU+ibKGuFHVXvUho1HAD/
4JKaG5k0jaF9uH2x6y2JiTMZknyn2ebHbOQkHLpEzA
wtjHICcMk5TIFmbQsBdMGLqJgDir0yGAd++k5D`"#E
C *
`urFv1LTKaHR0c0NZcIHRigU2vksxMDvSEgJrmtIYY
ySkaKCV1UD3y0ARzscUv0nEbKR1ekOh8I9X6SuBtUp
Rt2Z8sAcZuqYCxkPpXlTRWn+D0ge1EC+zWrrb8tZ6v
rT6b2r8kYOtBx/FWaE5ekpXNtAs1sl5gzc4iAyeZcT
6CTVGu0QEyGem+XJ+TgedNVdHoxdFvnl4oBLsaukC6
UMw4SZGkfs12xp+/50xYbToCpbkmXZBo7+MY1L`"#E
C *
`8i/CFUJs0ZqJ7TVfqIGrr+v0gHCe+Z/Pg8ID9uY8z
rU5Vx/ksLmcYJT8Hxy2G2jH8rrOKQWtVuy7P1mqrw0
b+j5AlXEAR133QLSIGzX0WLd5LQTPAxZ0gCpxX0git
7g0Z3yRVCICHzZ9Dk0wI/ldfTw7gDasG5siE2QO/Bv
BwNpiBG/46wbj+/cWCX6TkLiSoM2lDOneGI0vcuIRv
RBg+R1ZM/SU3nj0a7VesKoCcuMLg0MuiZiVoYp`"#E
C *
`zovzuffjPcEue1+KV7h4/5ca28AKQ5XpN6njDuzMI
cvi4I9ufXz+jkP1NrTf8b5zL8JKY6md7Hc+l9TMEzk
PRFLgL2ox+t9eYx1CB49JXKUJppHPUNxvFmGXWqy3g
nUHTC+6Ir83st4ObDHFYB1TJPo/FV2eae+zemy6xQn
P6ahr8IRBTJYE29yBASM7/9ME+9w8aXf8O53PqyTur
xgRudoSrzEtui+jlB/HozXWas3TQN0IDXXSFWY`"#E
C *
`OBWXy7xXLRNlU6+C12yVDtlLu5G2vgFamIpxiHQyb
sLlVbRdlKDtTTSi8cZbSop5S60QYF2igyMjXSAmpm7
HSrS7kILFWmnxsIqHSbjzn57P4rCdN+7A8DOuguBZs
l2OkN1OOQKc6SWy5r0hKX4YLIlnEnt85oAwZVRFTJM
x2gUeWa59ru9TEhLFeqTNQ0NoHPcgcvvjU33jwu5Ds
ZbG04pL8wh8NyUF0PuAjTubzuvD7CGJwT8Y2ky`"#E
C *
`WMYjxZwg6QWjYB1VOR275a3i3n5JeOsC9zvAh5p18
c+EX8LO9z8m7h4ZQlBc+YC9vyr5RgWuBCSzDP4VjeI
zK9GbWIKN/d03s4I9w4TaWzQ+lHm9t0Bu9x2mNVzub
Z+BE92HWx7yKrOH+4/+It9IALkGzykBJi2rK3HkXeE
IWmzXJboUfNWjSzFY7HmKX/ZJgQ3hBf6vo5cvbGkzM
uyVHDtvSN47My6iRI0TOmUlxgNlu1tFG5hqCb4`"#E
C *
`Y2IG7aUXORnd08vfB7ofb05PTs63N74enm/2DOLnI
8nJzyU7z0/K0PhO3ahB2FTIWdU9Ph7+f/D06PT3rfR
1h+Fin0+vREfEEFGW308WdJSwE/3R6nV6LoMMHhJM1
3h0KmeLu0Fcvj/DyUJJn575QBKKrMemuXpUsxLmr+d
xFSPAHQTlWyTFysmeoe4SPjJAQZq4BM9Nw3leoxSWh
B69fv3zNDl+wgyOYAbw+OH59ePDX/Wdsk+0/e/`"#E
C *
`byDXv08uVfDg+OjJg8V3XYQ6PpfkSzw13brwSarxK
dVwtjbchQDoirixv46awf9TRWrkcgd3TaPTl9Nz7tn
47O+qe90WV4GcRBuYdchw7YrGjGgegDqC0oqOX069P
Ns76qgv7SbYA+A7xLhqX8CuyWBtTX8PQ+yD7CrjGJx
ts2ktkG3snq1Gt1i2eOPke94Rv3xBV5UpxBzpecBto
iU1E99y+8dlsazZeIYsQIpglXLTwBRg/eBCaHC`"#E
C *
`l5Vf1W8G12ls4Qt86ooa5gPY5AlP5ufJxiVgpNju7
xccVY2UIZC8yMPGIxrwXM5EmvRGzbwMK0mdooeyE1o
ZVF3rVMPu/XrCIE70a20Ogd+nhM60l6IdSjg1Arts7
liBQ53UPsa4W5+eOGq6ojCdWubZkWVuNF1DaukhjB1
L4oM5ILWhmWydf6U57cfsVA4jBhRRN5eSldnOLS8lN
dffnc1QHqdpOhv7BzOKrt3GrHbfdKA3OyL9i7Q`"#E
C *
`Uck4bPHkgfJEVQJGFqjvzi6eipNecQbGO//yKc7QG
I9arCguoMyCgPGZRHhMzLgLCYJ/DsJH2AljvQjWNdk
TOB0AvTkRZyh/GOtpo8TUBwdWQjiBf+ti3lmJeccLK
bzLGRV0m7RwbPCLwhNzV7QFmxNIr6Ta3q23ClzV84y
WijV0mBMIrHuLSvRl67W/EpIBG0eo1x0CtAjaReW8O
VS5MeYp0s9iIf4yfLp1OOhez76KhaQh7sZDXuT`"#E
C *
`TMdEhYRUXg9XboW5V+p88CC6k8JpuByvEIDdtDiJi
Yy3D73fZlrra8AZ+8Mq12RBTPIVrYzw2YgRwkMgsyL
HeJcGqhnhd4YqL02T5Iade3JjmpNpXpRFqNBoO1HGx
CKwkIfRq1hGH78Upl1dr71m6W5aKYx6GPQvkxgHh+2
HB4de2EbnW3txqOLEPaTbrDruQqs3rUOOzYS3a2jmD
esTelxWaJbwZa2T6O7DU9O+G31Fr4zo9z5Lmhr`"#E
C *
`rVtLTOq/S+Yr4oKhW2xdxF3+AI9e/mDOCcZHWp8Db
7fi0IoCofwcq2WPUagxeynLEr4364biQlA71qjWgbB
HQJQZgKUczKBKARTcSLvOJxQUacRVEN6eJVv/Y9E+b
GhwmrMgBep4stbhps4ahf25EYtPLS3g67XAhY/ODDZ
dNFSOzuOwW5ajQbGe45s/LP32VN3GDy2S0nruqzs8Y
UI6Oyj5Yf8/Lb8+dxmvO9hsPqME/xvSKmDuoHr`"#E
C *
`mK2rKVWIGE83h0s4dW/O27VeI9GcarUxlBQ6W80nt
O+KgBtlZTX6TSZzOPFive3LcgmUgwgm57Wl8Atl7IZ
uXfqdk3U280oIVvB3Annzho4dzqOXtfiB9lyzFPtuw
oXvwFZDXlcOzB+ztP8JQk7BfzAHGKXfa8yzy9fFdUu
+/OfFbS6kNdEoS/iFS7d7UDSsfMRdLhk7OzclQx56X
Nw7BFb4T+82Wxu3P58T1uukZJBNRGvacwNDGh7`"#E
C *
`ghiaztPRStAkzS8KemYaMhbb9Hen9+UXVB0drxtze
5Ve0MPQ02WJyvUIy8opx/XYzTkhZHz/hNogNIH00aF
63Jde1snMwdQAQBRG/D7hV4A7KesbOhDQ5QTrmq7HK
gjumicLhl03WPCWTjB6V8wxeLL76pwzBAHFCaE5G4r
rFefO8q9Y3WlfHyIUzhl1eo2IT9qb72jBRfpVd2EhQ
jlstE+CqWBM5Eh5wS/9Nu4p0d6MXzh0aJJobjk`"#E
C *
`tmaWcBwRnHpGkQ5s8j2Ca72birwnpUtUiznnBuLnc
0av9F7wokx/bszCaJxCaPoKqkB7WsAs8CEiBq6jsRX
qvxtUIzDV0SR9f2X0nQkEdpJtSQTkjXxQeRGDRZml+
id0eqV+b+KRb1OuvVZTUqFG2pN89vPC1s3gfOCYfr6
TaKckl4S4l3NxxWP8R4vvwwC7YwAG5VnEnVWJZFU+j
jNm2Dngxc/Xt9w/GeoADqDesZYC8e/GDvPXAGr`"#E
C *
`t411boWpI2Avpu5+zZxZ3jAx4qeWmaU8zXT+7FViZ
i5YI2MnLnLozsuxJ1V862VbTpIm+65KcVyT+c6+qLO
exCNHFAYc74qDYaMmabrdIlB7ppUI9oOXINs4rF5bI
tnhjp2NsuHM+2sE0G3ntbXWWlrBp2PmUNwt+y2G5hN
gxYWJut41m0a0ndRr5qdsRXc8OrvuYarqVsSL3hVWV
tAiAvLNMVwWT9Bz1WzamRxQYuaXi/ySW9/QkTh`"#E
C *
`VScd+5ssS1tPCxBCL1h2+GbJIESO2uVcGbJd1X2fK
h6inqn18C7VoXXgGz7nmzcpBsFvmFf+zXR1MzzCj4H
s+lXloS53SZbdsDonZu98ymbbTfi49p97yaFW/OHNM
YdMSvmcO40+L/zHI780f8Ok7h/zd3+NXf7J5m78S2N
8OTNGM+fc/bGSfi80zdTNX2++ZvPzJYJ3Jrcba3qY6
dwAss/nvW3Wu7vPY2Tu3NN8zghZ/+ayH3ERO6P`"#E
C *
`mXCJnvwcMy7Ss/+adX2KWRdn5X/ZmRcXsntOvcy2/
xNNv4xm/X8+BRM6OA9vkLZuorZvzFm7+WZQzfmvj3h
wwhGHeB4vWqyFHTqg1SYPfAnFa4UqcGdeVtVhpQs6c
pOHkuwp5euWfYD+mY9wW9fG7+JYp7obUd2Nrs4rTPU
FUIoKQy13XHeXWFMMW4pfyWtPvMoVghZRCBw+1nU9+
Zijx+tKAlXiCoGs+Y79z4vprpdovF5fgd/pcJs`"#E
C *
`rbSNC8MIcDedFOUtKNO3jpkABgXgQcdjjYkGOSCQT
NutisUkN0vdYdDXentGmzbFON30Ts9mGqDoMcnolJK
C8RFg2zUKOWDrFWiTSiAYKCuUd2K8LOS1pE6tWYUUY
37uGfBVd30aeEQulBdcs7BzjcOP6zThGs5TD8c7Ot6
b98mPUrIez9bVJUjpVFsdoUXg3wVbF7i3aDplN4u22
BkR8G9xHv5GQrGSjkYFusWCPvzCOVLR1em4Hwf`"#E
C *
`Ha78Z9s6pPy6Xvvg8x6bvvFY/Mqu/OpvMyzg/n8WX
i3pkmePhQ5rcxEJHg+tEkRUhn6GgMGyqsVQ0Sv/omQ
VVoWtdTB+L+rkh90ZGtfhfYlRtrpG4/PHBAzfsJHNB
GrOYZ+nC3FddJeZHhtXum9xkqsEqa+SNAn0BE2gn9x
fOT2+H/hvDxsi46psyvkpFUXoKile1VXE3UTWndngr
7NbrFEhnrWKctrRM+EAOrvTh7WQvhmsd1m8n/c`"#E
C *
`F+t1drP8pSSdh4EtxvA7EloG7ot1WARZqhX1KwIcL
n90hCM2WrFvAMWDWY/ZPfEHX6rXEflS7SaRbE2Di03
FsrBJkrNItp6JUd78MAEvkY7Waq5HIKELwhIc7yIGa
FUj31srDqidCLVmX1VvQbD+/IbXxi2MSKogc9Ub390
CDzRc78A+Lbgd0L7KUPfIX1IeWIZY8Ux6e2oFziHZf
WdPAvBr4wlgnPcrXO6MAjlhN/bzfbzPyI8X7Z7`"#E
C *
`Z7127/wR7d5Z0e4du92tZ1ecN70/4+GS0YjR+easu
CwuLhg+V4pV5glduxeXN2tIPBWll06hqz6YvBUHPXE
nDRQcs25hWg/fqpsWWg2k6gAeQGAEMbSe6l0RybhBm
1F6mdpCMl6NhK/QEhb3lvK7BEKwzxALwZrCIVh7vAO
7e8gDWxH1wO4b+MA+TQA7u2McBPtEoRCheu8WDXHb3
IR/+O4/a9j9lTs46ZqbxXJvKbQpvP4xIvPTGiT`"#E
C *
`ZvPO95+Hy73NvfmqzfaPwI2p1fq6x//9Hc/IPYdxd
+dT8eCdbvYPPbJ81vFnTtE3je5yhPR/XJXWOIqZqln
HkTK7C9fnrrk3LsryF614DZM3tGklr44SzRzEa6XtR
uVIXJ9wopToJO0Jn7VQ3eE8tN0e5M6yDo0f7rw4mxy
8n+AY0Xlpt+hjwk24UU8FN6DPIRL4kIaZ6csIvflLJ
Pt4Bqe+I7J6cRqdfnT44/eG0c9bDKyLtyhFSSI`"#E
C *
`STMac9KU5WJ+rsss5Xvy2Leq/Dj292vqKkeL5QKQ8
oJdMgP1DCpU447VDKn775fq8TqhOIYfoGTtaNB+xcs
kY00qfy5JxeJDpvkIuLNMugl+aTWVLHaVbhzcYSp33
LMH94i67a05f0if1V41L6C+iCY3qEay+ApDjPW0vTl
fbaRbcL12mdieuf/ZL84a9jBAlfrRvE1UKKgdCdWTl
vo6rL0SdzeiY1TCDmrUOZh66FRjfu18aEXgW/R`"#E
C *
`7YVCYA9LGY3r+R7Bcw0USYgKLAiuwYX5Lkwb9Fjfo
995N97XRXLElQqKCVoQWNbLSj9nqt1SZeysi1F2xYl
gpfYtyFaSWLDO4frNO2TELnilnT/SvL71nr3e81bWe
KU+Qh2hG88b2CFEltjeN63YhdXY1tdwJbxZw0rtyk+
+KKojPHaSAAuXiOorwE6v+iJPjkAdF8UmAtGF8sP1W
9+F3fzUmQzVYY4RPyOqyisFMPFvDvRYRqsZ8GM`"#E
C *
`T4PXRcanyI6/q97xoM0BwOo4HSux49uH9Eap+769w
iyf8r4PZt5VIdTk6bDoAX9fke795js71FfjTtRXzep
HHZbOvCTCrVKJSkj+4cGIUP5watyrJ/pdyUefXt0Me
vKBC1dp7YJ4lOYrW+3Neuwe8thoXN++NutXch6Rnt2
L6xgDp4jtM8l5P1lyX+ZwUjHro3vA0ANDc0yr7/5Ca
dhxM0xwg4fWCmEzlY2N291XOB+taA1/rBXO8VJ`"#E
C *
`aIOcGQHibJ/ygsH7Fjy/rYRb2cDUwfuzj+9oDNr95
nVwevF/Qg8t1VcOfdJ5k6TytTejquKq16yXfXA69tu
y+s6yGjR+domqCRoYeUMZg3q2tLfHi+863moAN49Wo
7KguyvjS2LU1yGaBZxi0DTK4VtlvYrrqwkYZqB2pPs
QblNfBbiME1t4L5wS6i+PdakbrvAQnc+wNvLR6Eb9w
IdRJDv16p8K7IaLZneQHukstg2Zzz+CCuXIiJZ`"#E
C *
`HR28iM/+hGp6e//4gXjeKjG1FqPu8kC/DHFYw6Ahv
54eu7jDLBB2Oc0aJ6iZcQTwv/LmlqlhlZ+uTMmgzpl
5IdUOepZI6uNsREQaIxVqsFbw4fj/Cin0Df1maHWn1
T22JSm7Ihh7vTta4pdKlHxgA96WC77ckK/tctiy+Pm
MbT7iaTO9BV5kJwaITqIr8Wae53lbpUycPtrDK3Ilf
bEO1Kw541rtZi0h6s0luWmm4VRVu5VO0KK4T2X`"#E
C *
`phITQ2CCt65ZyvwfudHGLjqZZlepnmcaSP3yS3YP4
EtcoehYput7fburqObBk2lNJZ2PqIoON4r7JwAbfZ+
c3sPfORQCnTAJx1QrVvZC+BUXCYTvjneNYQ+eT+13c
Z8Nvnl6WvjpZYuf4CR7KDLWzKQxcJmoxgT+LA2c97c
prQNsX5tWQ/vMTAEHZZxWiUH1wkYlAiGzO60mA+BK4
uirMEA7RqLF9D1j9MKnzJ9U5RvX5VFnUxFhv0K`"#E
C *
`EdNvg72fyqeEVvGPnjEVkQWLYrFcdH+j5zKNqDD5C
hA4wNXjtKRDO04gRgtjjCwcdT9lxXmcCTQN4U+6mkA
pPzpIgXs+Dae847zAJVo7LfKLtJxP5tWlfotrhpjGc
nnFFet18XVcEgUTfuNvlY6lMnVeIYOpYeerTp+gTAw
tr4vpx+FcIO8xQHMwTMsE4/SsfhcwwYBKMbgMoQA9B
o148ebho0ekMMCwxGjqrRRxRBjh36Q5nyE+5bN`"#E
C *
`u/QAwTGAW78Xrvjv0Xb3dO8AtdgSg5AqoTvJf1G8Y
nk7e3+TvaN2JkN2GT2V/PKyfxgSJzTMDdXi5rR3O1E
Zul7GxQ7vnwoeVfQDPyZmjwEN8MSY63NfXMTIuyvZw
GWBdzleZ3HJO7IzQ8KYLszF2uKJx6q7jT8NxE8XNuC
PR7qKTqEib51BUABiH8D6+KD0MGTmXVvVpKtB1aWvs
R/PT6mAKLjQgDiUicXR0J0SNeAGPdfFIZ0soQn`"#E
C *
`CC1NbkTzmJiNqnsXd0dTQ2pSNXPOVcXSX8CGzgIWd
hYJx9SL5ZsuIuomp5PschzhkXrZpxNJkOO7a+dWeIQ
gqeEYLn1eXjNAZkZmOw/IZ3OgHX+6oSH0RXL5qGDj8
TAXTErsKDajE0ugxTYwa8PXz5+G9Rj8Ktult20F/hH
f3kLBBYutHhk9f7zw8MBVmIw39JvV+DoT9f1lBDOsN
Ob217U1EUmXsXBpbxxyxXwNXx+SE+xoQVba1CS`"#E
C *
`oQ8pPMca8GfK9C8WEkwxcGgexQG19065A/YP7pKs1
m3MA/PmopBBKzYEtvk6YSBDdmeEdPbo1E7wY4yT2sp
LP7DbRF/XMoQ/EZgZE+eRM1joaWk84SVDmJl6mmfwJ
nQEdvBsxxyKUzjNx486SEUXoUQKT+M3TFkzqU74yFy
nEDfrfDMmFu+FOFvTQhc+JoCtJrYcLOKDfLtHI8Pbe
HYVxMYgfQcmiVv+BTl0+3VCuzpthwooYBjjqXB`"#E
C *
`heKZuE7arBE2t31zReV21iBtZyVpO22k7dyTtG/WI
O2blaR900baN3cg7dZ9n2OBh+Iq7i+guKmHmdE5wVJ
0bHR5cUEG7IN8lErEiQlCoPJd/aTzLK7jAZB2keBat
HZyqGG45/d8//jpEI/lFeaRIl7JSTo7Q5YBDmvYCt9
CYuXP+IqYAMsXrfiqZbEEo+g3cVgm8+I66XaiPr7wC
+ow0qSyr2kjy130Ee82MHZpNTOduUuORhP27JK`"#E
C *
`81obCVsOvi3RmGn/+6HgAM/6DvXHb6/awT0YjhhMO
dhFPoak3MPkC6wVlixymwDk+llWn5LGxuIY5UFzWm8
tFj4sCOmoTWdAMDdRH0wD9okyvQQMBhynXOFY8oQOS
NJmST39T8iKm0/00wTLAs4JO0EMRqzJKsd51F32/If
GfaJAzW1mHIAA5PdAdqUzaL9cQtF9+Rg+eE0kXaZZ0
7ezhrzAJ9gRCdXioWjHW9twGI3arvZjgNheh13`"#E
C *
`wh/KcDfCCc87jPFLLm58LtDSdKruN6WVGE+ZYTKiM
a6L4g3jb/FkX8fUOPFXxlbnXna9nCUyZKakzggJLoc
qge1xFiFdBu3Wgk0KYVi3Mm6MnA8y7jjIEWhsQqyS4
2jZGTXzI1pPxWc3wue5qIajhv6ZAloUY8ERQmzFBzf
Ai6pDNuqJCMsZ3MfLJoO0dwzZTjxt7TQRbh/sMVxqo
ul1P+7rijKnS3gQOdLuqGw3+m9eOAzhknU3Hw1`"#E
C *
`JBpFHU0L8rQGhQHIhtZTr31D1GTDbUXhMF/9C7uZZ
KjsJyChvj3kTGTtiqnknjIfQUV8JkYtfhrE+aelvq0
LUrom/C0qZYgqMuX51k6dVQ5IxNHR313jZ4lz5APkQ
F9n1Vz8dtnt/1QJWiMpMSNoPCCvAs2xKotWI9TojWh
giZ3wstK0HAUIdoheJdmGTtPYCzCF3xvNKWRRWommZ
E+rZhdXJUd28OEf8LLaGSBtHWJfq22v0EOXziW`"#E
C *
`JcREg/G2MkMOGpnBLR/1oe0LOmhu4gssf60kxez3I
DkaYA2SHh+ZZBm41yHNZSv2fxNH5ZkGqNQdQE0rfno
0DcyRkVXxIt0NKz1dkWHiuhEViVwPgqtUOUgVPvTDH
tG6zv4irSR2KXKGkzaU47QrCfgr32nZ/Y/hzhZ9trc
F6c+S6yTblb9e0d6ehI62h1vgRMC4QFcAFALYifQyR
x3N8DgTOP08hhQMEqSDzRE25vENWN90elwsdsn`"#E
C *
`dIBwn4gTUGDfAWJ5UYJLepPnLfD9L42pMgGe8/M/7
xyBYu9iEh2XxDgoOZIakzcgTSQrkFcyEwSDMCUb+kL
mHrzBiD5oWEU3ibMF4e8B+BlTjrQF7BegK0Bp4UxKS
SjTdijjZybOj/VeHIX5TV/JFm/8H`"#EC *

319
6
raise exception type cx_nwbc_stati
c_check

exporting

textid = cx_nwbc_static_check=
>cx_file_not_found.

endcase.

1
ev_last_modified = 'Tue, 29 Jan 2013 0
9:17:58 GMT'. "#EC NOTEXT

1
ev_last_modified = 'Mon, 08 Apr 2013 0
9:52:08 GMT'. "#EC NOTEXT
0120031469
41
0001232874
0004
16
LIMU
CINC
CL_NWBC_RUNTIME35=============CCAU

00006

LIMU
CINC
CL_NWBC_RUNTIME35=============CCAU

00000

31
1
\\\\\no_empty_blocks/////
1
\\\\\comments_not_ignored/////
1
\\\\\delta_normalized/////
3
\\\\\allowed/////
FORM
*
3
\\\\\allowed/////
FUNCTION
*
3
\\\\\allowed/////
MODULE
**
3
\\\\\allowed/////
REPORT
*
3
\\\\\allowed/////
PROGRAM
*
3
\\\\\allowed/////
FUNCTION-POOL
*
3
\\\\\allowed/////
AT
LINE-SELECTION
3
\\\\\allowed/////
AT
USER-COMMAND
4
\\\\\allowed/////
AT
SELECTION-SCREEN
**
3
\\\\\allowed/////
AT
PF*
2
\\\\\allowed/////
INITIALIZATION
2
\\\\\allowed/////
START-OF-SELECTION
2
\\\\\allowed/////
END-OF-SELECTION
3
\\\\\allowed/////
TOP-OF-PAGE
**
2
\\\\\allowed/////
END-OF-PAGE
3
\\\\\allowed/////
GET
**
3
\\\\\forbidden/////
GET
BADI
3
\\\\\forbidden/////
GET
BIT
3
\\\\\forbidden/////
GET
CONNECTION
3
\\\\\forbidden/////
GET
CURSOR
3
\\\\\forbidden/////
GET
DATASET
3
\\\\\forbidden/////
GET
LOCALE
3
\\\\\forbidden/////
GET
PARAMETER
3
\\\\\forbidden/////
GET
PF-STATUS
3
\\\\\forbidden/////
GET
PROPERTY
3
\\\\\forbidden/////
GET
REFERENCE
3
\\\\\forbidden/////
GET
RUN
3
\\\\\forbidden/////
GET
TIME
1
0
1
1
0
0
897

*-----------------------------------------
-----------------------------*

* CLASS CL_NUMBER_NON_SERIALIZABLE D
EFINITION

*-----------------------------------------
-----------------------------*

*
*-----------------------------------------
-----------------------------*

CLASS cl_number_non_serializable DEFINITIO


N FINAL.

PUBLIC SECTION.

METHODS: set IMPORTING iv_int TYPE i,

get RETURNING value(rv_int) T


YPE i.

PRIVATE SECTION.

DATA: mv_int TYPE i.

ENDCLASS. "CL_NUMBER_NON_SER
IALIZABLE
*-----------------------------------------
-----------------------------*

* CLASS CL_NUMBER_NON_SERIALIZABLE I
MPLEMENTATION

*-----------------------------------------
-----------------------------*

*-----------------------------------------
-----------------------------*

CLASS cl_number_non_serializable IMPLEMENT


ATION.

METHOD set.

mv_int = iv_int.
ENDMETHOD. "set

METHOD get.

rv_int = mv_int.

ENDMETHOD. "get

ENDCLASS. "CL_NUMBER_NO
N_SERIALIZABLE IMPLEMENTATION

*-----------------------------------------
-----------------------------*

* CLASS CL_NUMBER_SERIALIZABLE DEFIN


ITION

*-----------------------------------------
-----------------------------*
*

*-----------------------------------------
-----------------------------*

CLASS cl_number_serializable DEFINITION FI


NAL.

PUBLIC SECTION.

INTERFACES: if_serializable_object.

METHODS: set IMPORTING iv_int TYPE i,

get RETURNING value(rv_int) T


YPE i.

PRIVATE SECTION.
DATA: mv_int TYPE i.

ENDCLASS. "CL_NUMBER_NON_SER
IALIZABLE

*-----------------------------------------
-----------------------------*

* CLASS CL_NUMBER_SERIALIZABLE IMPLE


MENTATION

*-----------------------------------------
-----------------------------*

*-----------------------------------------
-----------------------------*

CLASS cl_number_serializable IMPLEMENTATIO


N.
METHOD set.

mv_int = iv_int.

ENDMETHOD. "set

METHOD get.

rv_int = mv_int.

ENDMETHOD. "get

ENDCLASS. "CL_NUMBER_SE
RIALIZABLE IMPLEMENTATION
*-----------------------------------------
-----------------------------*

* CLASS cl_Nwbc_Obn_Param_Test DEFIN


ITION

*-----------------------------------------
-----------------------------*

*-----------------------------------------
-----------------------------*

CLASS cl_nwbc_obn_param_test DEFINITION FO


R TESTING FINAL

" DURATION SHORT RISK LEVEL HARMLESS -->


not supported in SAP_BASIS700

"#AU Duration Short

"#AU Risk_Level Harmless


.

PRIVATE SECTION.

* ================

TYPES: BEGIN OF ts_table_with_objects,

index TYPE i,

o_instance TYPE REF TO ob


ject,

END OF ts_table_with_objects
.

TYPES:
t_cluster_id(44) TYPE c .

CONSTANTS: cv_rows_limit TYPE i VALUE


200.

METHODS: test_simple_table FOR TESTING


.

METHODS: test_text_table FOR TESTING.

METHODS: test_referenced_table FOR TES


TING.

METHODS: test_object_table FOR TESTING


.
METHODS: test_nested_table FOR TESTING
.

METHODS: test_technical_table FOR TEST


ING.

CLASS-METHODS obn_param_get

IMPORTING

!iv_unique_key TYPE cl_nwbc=>t_obn


_param_unique_key

EXPORTING

value(et_data) TYPE data

RAISING

cx_nwbc_static_check .
CLASS-METHODS obn_param_set

IMPORTING

!it_data TYPE data

!iv_unique_key TYPE cl_nwbc=>t_obn


_param_unique_key OPTIONAL

RETURNING

value(rv_unique_key) TYPE cl_nwbc=


>t_obn_param_unique_key

RAISING

cx_nwbc_static_check .
CLASS-METHODS obn_param_clean_up_db .

CLASS-METHODS obn_param_build_cluster_
id

IMPORTING

!iv_uname LIKE sy-uname OPTIONAL

!iv_unique_key TYPE cl_nwbc=>t_obn


_param_unique_key

RETURNING

value(rv_cluster_id) TYPE t_cluste


r_id .
ENDCLASS. "cl_Nwbc_Obn_Param_Test

*-----------------------------------------
-----------------------------*

* CLASS cl_Nwbc_Obn_Param_Test IMPLE


MENTATION

*-----------------------------------------
-----------------------------*

*-----------------------------------------
-----------------------------*
CLASS cl_nwbc_obn_param_test IMPLEMENTATIO
N.

* ========================================
====

METHOD test_simple_table.

* =====================

FIELD-SYMBOLS:

<ls_table> TYPE ANY,

<ls_table_return> TYPE ANY,

<lt_table_return> TYPE STAND


ARD TABLE,
<lt_table> TYPE STAND
ARD TABLE.

DATA:

lv_unique_key TYPE cl_nw


bc=>t_obn_param_unique_key,

lr_table TYPE REF T


O data,

lr_table_return TYPE REF T


O data.

TRY.

CREATE DATA lr_table TYPE S


TANDARD TABLE OF ('NWBC_NAV_TREE') WITH DE
FAULT KEY.

CREATE DATA lr_table_return TYPE S


TANDARD TABLE OF ('NWBC_NAV_TREE') WITH DE
FAULT KEY.

ASSIGN lr_table->* TO <lt_t


able>.

ASSIGN lr_table_return->* TO <lt_t


able_return>.

CATCH cx_sy_create_data_error .

RETURN.

ENDTRY.

TRY .

SELECT * FROM ('NWBC_NAV_TREE') IN


TO TABLE <lt_table> UP TO cv_rows_limit RO
WS.
lv_unique_key = obn_param_set( it_
data = <lt_table> ).

obn_param_get( EXPORTING iv_unique


_key = lv_unique_key

IMPORTING
et_data = <lt_table_return> ).

ASSERT LINES( <lt_table> ) EQ LINE


S( <lt_table_return> ).

LOOP AT <lt_table> ASSIGNING <ls_t


able>.

READ TABLE <lt_table_return> ASS


IGNING <ls_table_return> INDEX sy-tabix.

ASSERT <ls_table> EQ <ls_table_r


eturn>.

ENDLOOP.

CATCH cx_nwbc_static_check.
ASSERT 1 = 0. "should never happen

ENDTRY.

ENDMETHOD. "test_simp
le_table

METHOD test_text_table.

* =====================

DATA: lt_text_table TYPE STANDARD TABL


E OF agr_hiert,
lt_return_text_table TYPE STANDA
RD TABLE OF agr_hiert,

ls_text_data LIKE LINE OF lt_tex


t_table,

ls_return_text_data LIKE LINE OF


lt_return_text_table,

lv_unique_key TYPE cl_nwbc=>t_ob


n_param_unique_key.

TRY .

SELECT * FROM agr_hiert INTO TABLE


lt_text_table UP TO cv_rows_limit ROWS.
lv_unique_key = obn_param_set( it_
data = lt_text_table ).

obn_param_get( EXPORTING iv_unique


_key = lv_unique_key

IMPORTING
et_data = lt_return_text_table ).

ASSERT LINES( lt_text_table ) EQ L


INES( lt_return_text_table ).

LOOP AT lt_text_table INTO ls_text


_data.
READ TABLE lt_return_text_table
INTO ls_return_text_data INDEX sy-tabix.

ASSERT ls_text_data EQ ls_return


_text_data.

ENDLOOP.

CATCH cx_nwbc_static_check.

ASSERT 1 = 0. "should never happen

ENDTRY.

ENDMETHOD. "test_text
_table
METHOD test_referenced_table.

* =====================

TYPES: tt_agr_hiert TYPE STANDARD TABL


E OF agr_hiert WITH NON-UNIQUE KEY table_l
ine,

BEGIN OF ts_table_with_refere
nced_data,

spras TYPE spras,

texts TYPE REF TO tt_agr_h


iert,

END OF ts_table_with_referenc
ed_data.

DATA: lt_table_with_referenced_data TY
PE STANDARD TABLE OF ts_table_with_referen
ced_data,

ls_table_with_referenced_data LI
KE LINE OF lt_table_with_referenced_data,

lt_return_table_with_ref_data TY
PE STANDARD TABLE OF ts_table_with_referen
ced_data,

lt_agr_hiert TYPE STANDARD TABLE


OF agr_hiert,

ls_agr_hiert LIKE LINE OF lt_agr


_hiert,

lr_texts TYPE REF TO data,

lv_spras TYPE spras,

lv_unique_key TYPE cl_nwbc=>t_ob


n_param_unique_key.
FIELD-SYMBOLS: <ft_texts> TYPE tt_agr_
hiert.

TRY .

SELECT * FROM agr_hiert INTO TABLE


lt_agr_hiert UP TO cv_rows_limit ROWS ORD
ER BY spras."WHERE spras = 'E'."ORDER BY s
pras.

CREATE DATA lr_texts TYPE STANDARD


TABLE OF agr_hiert.

ASSIGN lr_texts->* TO <ft_texts>.

LOOP AT lt_agr_hiert INTO ls_agr_h


iert.
IF sy-tabix NE 1 AND lv_spras NE
ls_agr_hiert-spras.

ls_table_with_referenced_data-
spras = lv_spras.

GET REFERENCE OF <ft_texts> IN


TO ls_table_with_referenced_data-texts.

APPEND ls_table_with_reference
d_data TO lt_table_with_referenced_data.

CREATE DATA lr_texts TYPE STAN


DARD TABLE OF agr_hiert.

ASSIGN lr_texts->* TO <ft_text


s>.

ENDIF.

APPEND ls_agr_hiert TO <ft_texts


>.
lv_spras = ls_agr_hiert-spras.

ENDLOOP.

lv_unique_key = obn_param_set( it_


data = lt_table_with_referenced_data ).

obn_param_get( EXPORTING iv_unique


_key = lv_unique_key

IMPORTING
et_data = lt_return_table_with_ref_d
ata ).

ASSERT LINES( lt_table_with_refere


nced_data ) EQ LINES( lt_return_table_with
_ref_data ).
CATCH cx_nwbc_static_check.

ASSERT 1 = 0. "should never happen

ENDTRY.

ENDMETHOD. "test_refe
renced_table

METHOD test_object_table.
* =====================

DATA: lt_table_with_objects TYPE STAND


ARD TABLE OF ts_table_with_objects,

ls_table_with_objects LIKE LINE


OF lt_table_with_objects,

lt_return_table_with_objects TYP
E STANDARD TABLE OF ts_table_with_objects,

lo_number_non_serializable TYPE
REF TO cl_number_non_serializable,

lo_number_serializable TYPE REF


TO cl_number_serializable,

lv_unique_key TYPE cl_nwbc=>t_ob


n_param_unique_key

.
TRY .

DO 2 TIMES.

ls_table_with_objects-index = sy
-index.

CASE ls_table_with_objects-index
.

WHEN 1.

CREATE OBJECT ls_table_with_


objects-o_instance TYPE cl_number_serializ
able.

lo_number_serializable ?= ls
_table_with_objects-o_instance.

lo_number_serializable->set(
EXPORTING iv_int = 6 ).

WHEN 2.
CREATE OBJECT ls_table_with_
objects-o_instance TYPE cl_number_non_seri
alizable.

lo_number_non_serializable ?
= ls_table_with_objects-o_instance.

lo_number_non_serializable->
set( EXPORTING iv_int = 6 ).

ENDCASE.

APPEND ls_table_with_objects TO
lt_table_with_objects.

ENDDO.
lv_unique_key = obn_param_set( it_
data = lt_table_with_objects ).

obn_param_get( EXPORTING iv_unique


_key = lv_unique_key

IMPORTING
et_data = lt_return_table_with_objec
ts ).

ASSERT LINES( lt_table_with_object


s ) EQ LINES( lt_return_table_with_objects
).

CATCH cx_nwbc_static_check.

ASSERT 1 = 0. "should never happen


ENDTRY.

ENDMETHOD. "test_obje
ct_table

METHOD test_nested_table.

* =====================

TYPES: BEGIN OF ts_table_with_nested_t


able,

index TYPE i,
nested_table_text TYPE STA
NDARD TABLE OF agr_hiert WITH NON-UNIQUE K
EY table_line,

nested_table_with_objects
TYPE STANDARD TABLE OF ts_table_with_objec
ts WITH NON-UNIQUE KEY table_line,

END OF ts_table_with_nested_tab
le.

DATA: lt_text_table TYPE STANDARD TABL


E OF agr_hiert,

lt_table_with_objects TYPE STAND


ARD TABLE OF ts_table_with_objects,

lt_table_with_nested_table TYPE
STANDARD TABLE OF ts_table_with_nested_tab
le,

ls_line_with_nested_table LIKE L
INE OF lt_table_with_nested_table,

lt_return_tab_with_nested_tab TY
PE STANDARD TABLE OF ts_table_with_nested_
table,
ls_table_with_objects LIKE LINE
OF lt_table_with_objects,

lo_number_non_serializable TYPE
REF TO cl_number_non_serializable,

lo_number_serializable TYPE REF


TO cl_number_serializable,

lv_unique_key TYPE cl_nwbc=>t_ob


n_param_unique_key.

TRY .

* build text table

SELECT * FROM agr_hiert INTO TABLE


lt_text_table UP TO cv_rows_limit ROWS.

* build objcet table


DO 2 TIMES.

ls_table_with_objects-index = sy
-index.

CASE ls_table_with_objects-index
.

WHEN 1.

CREATE OBJECT ls_table_with_


objects-o_instance TYPE cl_number_serializ
able.

lo_number_serializable ?= ls
_table_with_objects-o_instance.

lo_number_serializable->set(
EXPORTING iv_int = 6 ).

WHEN 2.

CREATE OBJECT ls_table_with_


objects-o_instance TYPE cl_number_non_seri
alizable.
lo_number_non_serializable ?
= ls_table_with_objects-o_instance.

lo_number_non_serializable->
set( EXPORTING iv_int = 6 ).

ENDCASE.

APPEND ls_table_with_objects TO
lt_table_with_objects.

ENDDO.

* build nested table

ls_line_with_nested_table-index =
1.

ls_line_with_nested_table-nested_t
able_text = lt_text_table.

ls_line_with_nested_table-nested_t
able_with_objects = lt_table_with_objects.

APPEND ls_line_with_nested_table T
O lt_table_with_nested_table.

lv_unique_key = obn_param_set( it_


data = lt_table_with_nested_table ).

obn_param_get( EXPORTING iv_unique


_key = lv_unique_key

IMPORTING
et_data = lt_return_tab_with_nested_
tab ).
ASSERT LINES( lt_table_with_nested
_table ) EQ LINES( lt_return_tab_with_nest
ed_tab ).

CATCH cx_nwbc_static_check.

ASSERT 1 = 0. "should never happen

ENDTRY.

ENDMETHOD. "test_nest
ed_table
METHOD test_technical_table.

* =====================

TYPES: BEGIN OF ts_table_with_ref_tec_


data,

spras TYPE spras,

texts TYPE REF TO data,

END OF ts_table_with_ref_tec_da
ta.

DATA: lt_table_with_ref_tec_data TYPE


STANDARD TABLE OF ts_table_with_ref_tec_da
ta,

ls_table_with_ref_tec_data LIKE
LINE OF lt_table_with_ref_tec_data,
lt_r_table_with_ref_tec_data TYP
E STANDARD TABLE OF ts_table_with_ref_tec_
data,

lt_agr_hiert TYPE STANDARD TABLE


OF agr_hiert,

ls_agr_hiert LIKE LINE OF lt_agr


_hiert,

lr_texts_tec TYPE REF TO data,

lv_spras TYPE spras,

lv_unique_key TYPE cl_nwbc=>t_ob


n_param_unique_key.

FIELD-SYMBOLS: <ft_texts_tec> TYPE STA


NDARD TABLE.

TRY .
SELECT * FROM agr_hiert INTO TABLE
lt_agr_hiert UP TO cv_rows_limit ROWS ORD
ER BY spras."WHERE spras = 'E'."ORDER BY s
pras.

CREATE DATA lr_texts_tec TYPE STAN


DARD TABLE OF agr_hiert.

ASSIGN lr_texts_tec->* TO <ft_text


s_tec>.

LOOP AT lt_agr_hiert INTO ls_agr_h


iert.
IF sy-tabix NE 1 AND lv_spras NE
ls_agr_hiert-spras.

ls_table_with_ref_tec_data-spr
as = lv_spras.

GET REFERENCE OF <ft_texts_tec


> INTO ls_table_with_ref_tec_data-texts.

APPEND ls_table_with_ref_tec_d
ata TO lt_table_with_ref_tec_data.

CREATE DATA lr_texts_tec TYPE


STANDARD TABLE OF agr_hiert.

ASSIGN lr_texts_tec->* TO <ft_


texts_tec>.

ENDIF.

APPEND ls_agr_hiert TO <ft_texts


_tec>.

lv_spras = ls_agr_hiert-spras.
ENDLOOP.

IF lt_table_with_ref_tec_data IS N
OT INITIAL.

lv_unique_key = obn_param_set( i
t_data = lt_table_with_ref_tec_data ).

ASSERT 1 = 0. "exception expecte


d; code should never be processed

obn_param_get( EXPORTING iv_uniq


ue_key = lv_unique_key

IMPORTIN
G et_data = lt_r_table_with_ref_tec_
data ).

ASSERT LINES( lt_table_with_ref_


tec_data ) EQ LINES( lt_r_table_with_ref_t
ec_data ).

ENDIF.

CATCH cx_nwbc_static_check.
"#EC NO_HANDLER

ENDTRY.

ENDMETHOD. "test_tech
nical_table
METHOD obn_param_get.

DATA: lv_cluster_id TYPE t_cluster_id,

lv_xml TYPE xstring,

lx_error TYPE REF TO cx_root

TRY.

* get rid of old content

obn_param_clean_up_db( ).

* get data
lv_cluster_id = obn_param_build_cl
uster_id( iv_unique_key = iv_unique_key ).

IMPORT xml = lv_xml FROM DATABASE


nwbc_obn_param(dt) ID lv_cluster_id.

CALL TRANSFORMATION id

SOURCE XML lv_xml

RESULT data = et_data.

CATCH cx_transformation_error INTO l


x_error.

RAISE EXCEPTION TYPE cx_nwbc_stati


c_check

EXPORTING
textid = cx_nwbc_static_chec
k=>cx_obn_param_format_invalid

previous = lx_error.

ENDTRY.

ENDMETHOD. "obn_param
_get

METHOD obn_param_set.

DATA: ls_nwbc_obn_param TYPE nwbc_obn_


param,

lv_cluster_id TYPE t_cluster_id,


lv_xml TYPE xstring,

lx_error TYPE REF TO cx_root

TRY .

* get rid of old content

obn_param_clean_up_db( ).

* get unique id

IF iv_unique_key IS NOT INITIAL.


"check unique id

SELECT SINGLE * FROM nwbc_obn_pa


ram INTO ls_nwbc_obn_param WHERE relid = '
DT'

AND uname =
sy-uname

AND obn_para
m_key = iv_unique_key

AND srtf2 =
0.

IF sy-subrc EQ 0.

"supplied unique id is not uni


que

RAISE EXCEPTION TYPE cx_nwbc_s


tatic_check

EXPORTING
textid = cx_nwbc_static_ch
eck=>cx_obn_param_key_not_unique.

ENDIF.

rv_unique_key = iv_unique_key.

ELSE.

"create unique id

TRY.

CALL METHOD ('CL_SYSTEM_UUID


')=>create_uuid_x16_static

RECEIVING
uuid = rv_unique_key.

CATCH cx_sy_dyn_call_error.

DATA lv_guid16 TYPE guid_16.

CALL FUNCTION 'GUID_CREATE'

IMPORTING

ev_guid_16 = lv_guid16.

rv_unique_key = lv_guid16.

ENDTRY.
ENDIF.

lv_cluster_id = obn_param_build_cl
uster_id( iv_unique_key = rv_unique_key ).

* transformation to XML

CALL TRANSFORMATION id

SOURCE data = it_data

RESULT XML lv_xml

OPTIONS data_refs = 'heap'


initial_components = 'suppress'. "#EC NOTE
XT

CONVERT DATE sy-datum TIME sy-uzei


t INTO TIME STAMP ls_nwbc_obn_param-set_ti
mestamp TIME ZONE sy-zonlo.

* store it on DB

EXPORT xml = lv_xml TO DATABASE nw


bc_obn_param(dt) FROM ls_nwbc_obn_param ID
lv_cluster_id.

CATCH cx_transformation_error INTO l


x_error.

RAISE EXCEPTION TYPE cx_nwbc_stati


c_check

EXPORTING

textid = cx_nwbc_static_chec
k=>cx_obn_param_format_invalid

previous = lx_error.

CATCH cx_root INTO lx_error.


RAISE EXCEPTION TYPE cx_nwbc_stati
c_check

EXPORTING

textid = cx_nwbc_static_chec
k=>cx_root

previous = lx_error.

ENDTRY.

ENDMETHOD. "obn_param
_set

METHOD obn_param_clean_up_db.

DATA: ls_nwbc_obn_param TYPE nwbc_obn_


param,

lv_set_date LIKE sy-datum,


lv_set_time LIKE sy-uzeit,

lv_invalid_timestamp LIKE ls_nwb


c_obn_param-set_timestamp,

lv_set_timestamp LIKE ls_nwbc_ob


n_param-set_timestamp,

lv_cluster_id TYPE t_cluster_id

* check first whether there was already a


run today

SELECT SINGLE * FROM nwbc_obn_param IN


TO ls_nwbc_obn_param WHERE relid = 'ME'

AND uname = 'SAP===


======'
AND obn_param_key =
'CLEAN_UP_RUN'

AND srtf2 = 0.

IF sy-subrc EQ 0.

CONVERT TIME STAMP ls_nwbc_obn_param


-set_timestamp TIME ZONE sy-zonlo INTO DAT
E lv_set_date TIME lv_set_time.

IF lv_set_date EQ sy-datum.

"clean up was already running

RETURN.

ENDIF.

ENDIF.
* clean up was not yet performed today

CONVERT DATE sy-datum TIME sy-uzeit IN


TO TIME STAMP lv_invalid_timestamp TIME ZO
NE sy-zonlo.

SUBTRACT 100 FROM lv_invalid_timestamp


."timeout of cached data after 10 minutes

DELETE FROM nwbc_obn_param WHERE set_t


imestamp LT lv_invalid_timestamp.

* set timestamp that run was today

CONVERT DATE sy-datum TIME sy-uzeit IN


TO TIME STAMP lv_set_timestamp TIME ZONE s
y-zonlo.

ls_nwbc_obn_param-set_timestamp = lv_s
et_timestamp.

lv_cluster_id = obn_param_build_cluste
r_id( iv_uname = 'SAP' iv_unique_key = 'CL
EAN_UP_RUN' ).

EXPORT set_time = lv_set_time TO DATAB


ASE nwbc_obn_param(me) FROM ls_nwbc_obn_pa
ram ID lv_cluster_id.

ENDMETHOD. "OBN_PARAM
_CLEAN_UP_DB

METHOD obn_param_build_cluster_id.

* build cluster id like 'MUSTERMANN==SAMPL


E_UNIQUE_ID'

DATA: lv_uname TYPE string,

lv_name_length TYPE i,

lv_count_fill_stuff TYPE i.

IF iv_uname IS NOT INITIAL.

lv_uname = iv_uname.
ELSE.

lv_uname = sy-uname.

ENDIF.

lv_name_length = STRLEN( lv_uname ).

lv_count_fill_stuff = 12 - lv_name_len
gth.

rv_cluster_id = lv_uname.

DO lv_count_fill_stuff TIMES.

CONCATENATE rv_cluster_id '=' INTO r


v_cluster_id.
ENDDO.

CONCATENATE rv_cluster_id iv_unique_ke


y INTO rv_cluster_id.

ENDMETHOD. "OBN_PARAM
_BUILD_CLUSTER_ID

ENDCLASS. "cl_Nwbc_Obn_Param_Test

*-----------------------------------------
-----------------------------*

* CLASS lc_ut_associated DEFINITION

*-----------------------------------------
-----------------------------*
*

*-----------------------------------------
-----------------------------*

CLASS lc_ut_associated DEFINITION FOR TEST


ING FINAL

" DURATION SHORT RISK LEVEL HARMLESS -->


not supported in SAP_BASIS700

"#AU Duration Short

"#AU Risk_Level Harmless

PRIVATE SECTION.
* ================

DATA: f_cut TYPE REF TO if_nwbc_runtim


e35. "class under test

CONSTANTS: mc_associated_role TYPE agr


_name VALUE 'Y_NWBC_ASSOCIATED'.

METHODS:

setup,
teardown,

assert_equals IMPORTING act TYPE any

exp TYPE any

msg TYPE cse


quence OPTIONAL

level TYPE aun


it_level DEFAULT if_aunit_constants=>criti
cal

RETURNING value(assertio
n_failed) TYPE abap_bool,

append_unique_id IMPORTING agr_name


TYPE agr_name OPTIONAL
origin_id
TYPE string OPTIONAL

id
TYPE string OPTIONAL

CHANGING unique_ids
TYPE if_nwbc_runtime35=>t_unique_ids,

get_associated_apps FOR TESTING,

get_associated_links FOR TESTING,

get_associated_searches FOR TESTING.

ENDCLASS. "lc_ut_associated
CLASS cl_nwbc_runtime35 DEFINITION LOCAL F
RIENDS lc_ut_associated.

*-----------------------------------------
-----------------------------*

* CLASS lc_ut_associated IMPLEMENTAT


ION

*-----------------------------------------
-----------------------------*

*
*-----------------------------------------
-----------------------------*

CLASS lc_ut_associated IMPLEMENTATION.

* ========================================

METHOD setup.

DATA: i35version TYPE i,

lv_role_exist TYPE abap_bool,

lv_role_filter TYPE string.


lv_role_exist = cl_nwbc_runtime35=>is_
role_exist( mc_associated_role ).

IF lv_role_exist EQ abap_false.

DATA: lv_detail TYPE string.

CONCATENATE `Please import role ` mc


_associated_role ` from Y3S(111) system in
to ` sy-sysid `(` sy-mandt `)` ` to proces
s unit tests.` INTO lv_detail.

cl_aunit_assert=>abort( msg = `Test


role is not available.` detail = lv_detail
).

ENDIF.

i35version = cl_nwbc=>get_runtime
_iversion( if_nwbc_runtime35=>version ).
lv_role_filter = mc_associated_role.

f_cut ?= cl_nwbc_factory=>get_nwbc_run
time( iv_cockpit = if_nwbc_runtime=>c
ockpit_role_filter_alias

iv_role_filter = lv_role_filter

iv_version = i35version ).

ENDMETHOD. "setup
METHOD teardown.

ENDMETHOD. "teardown

METHOD assert_equals.

assertion_failed = cl_aunit_assert=>as
sert_equals( act = act exp = exp msg = msg
level = level ).

ENDMETHOD. "assert_eq
uals
METHOD append_unique_id.

DATA: lv_agr_name TYPE agr_name,

lv_origin_id TYPE string.

FIELD-SYMBOLS: <fs> LIKE LINE OF uniqu


e_ids.

APPEND INITIAL LINE TO unique_ids ASSI


GNING <fs>.
IF id IS NOT INITIAL.

SPLIT id AT `:` INTO lv_agr_name lv_


origin_id.

ELSE.

lv_agr_name = agr_name.

lv_origin_id = origin_id.

ENDIF.

<fs> = cl_nwbc_runtime35=>encode_uniqu
e_id( agr_name = lv_agr_name origin_id = l
v_origin_id ).
ENDMETHOD. "append_un
ique_id

METHOD get_associated_apps.

DATA: lt_act TYPE if_nwbc_runtime35=>t


_unique_ids,

lt_exp LIKE lt_act.


"*************************************
*************************

" search for all side panels asigned e


ntries in specific role

CLEAR: lt_act, lt_exp.

f_cut->get_associated_apps( EXPORTING
iv_role = `Y_NWBC_SP_TEST2` IMPORTING et_n
ode_ids = lt_act ).

append_unique_id( EXPORTING id = `Y_NW


BC_SP_DEFINITION:10` CHANGING unique_ids
= lt_exp ).

append_unique_id( EXPORTING id = `Y_NW


BC_SP_DEFINITION:6` CHANGING unique_ids
= lt_exp ).

append_unique_id( EXPORTING id = `Y_NW


BC_SP_DEFINITION:7` CHANGING unique_ids
= lt_exp ).

append_unique_id( EXPORTING id = `Y_NW


BC_SP_TEST2:14` CHANGING unique_ids
= lt_exp ).

append_unique_id( EXPORTING id = `Y_NW


BC_SP_DEFINITION:21` CHANGING unique_ids
= lt_exp ).

append_unique_id( EXPORTING id = `Y_NW


BC_SP_DEFINITION:12` CHANGING unique_ids
= lt_exp ).

SORT: lt_act, lt_exp.

assert_equals( act = lt_act exp = lt_e


xp msg = 'Reading of side panels for role
entries fails').

DATA: lv_unique_id TYPE string.


"*************************************
*************************

" search for inherited side panels by


unique id (assignment by name)

CLEAR: lt_act, lt_exp.

lv_unique_id = cl_nwbc_runtime35=>enco
de_unique_id( agr_name = `Y_NWBC_SP_TEST1`
origin_id = `18` ).

f_cut->get_associated_apps( EXPORTING
iv_unique_id = lv_unique_id IMPORTING et_n
ode_ids = lt_act ).

append_unique_id( EXPORTING id = `Y_NW


BC_SP_TEST1:59` CHANGING unique_ids = lt_e
xp ).
append_unique_id( EXPORTING id = `Y_NW
BC_SP_TEST1:63` CHANGING unique_ids = lt_e
xp ).

SORT: lt_act, lt_exp.

assert_equals( act = lt_act exp = lt_e


xp msg = 'Reading the inherited side panel
s by unique id fails').

"*************************************
*************************

" search for explicitly assigned side


panels by unique id

CLEAR: lt_act, lt_exp.


lv_unique_id = cl_nwbc_runtime35=>enco
de_unique_id( agr_name = `Y_NWBC_SP_TEST2`
origin_id = `5` ).

f_cut->get_associated_apps( EXPORTING
iv_unique_id = lv_unique_id IMPORTING et_n
ode_ids = lt_act ).

append_unique_id( EXPORTING id = `Y_NW


BC_SP_DEFINITION:9` CHANGING unique_ids =
lt_exp ).

assert_equals( act = lt_act exp = lt_e


xp msg = 'Reading explicitly assigned side
panels by unique id fails').

"*************************************
*************************
" search for explicitly assigned side
panels by unique id (assignment by node)

CLEAR: lt_act, lt_exp.

lv_unique_id = cl_nwbc_runtime35=>enco
de_unique_id( agr_name = `Y_NWBC_SP_TEST1`
origin_id = `22` ).

f_cut->get_associated_apps( EXPORTING
iv_unique_id = lv_unique_id IMPORTING et_n
ode_ids = lt_act ).

append_unique_id( EXPORTING id = `Y_NW


BC_SP_TEST1:59` CHANGING unique_ids = lt_e
xp ).

append_unique_id( EXPORTING id = `Y_NW


BC_SP_TEST1:63` CHANGING unique_ids = lt_e
xp ).

append_unique_id( EXPORTING id = `Y_NW


BC_SP_TEST1:45` CHANGING unique_ids = lt_e
xp ).

SORT: lt_act, lt_exp.

assert_equals( act = lt_act exp = lt_e


xp msg = 'Reading explicitly assigned (by
node id) side panels by unique id fails').

"*************************************
*************************

" search for explicitly assigned side


panels by WDA name without configuration

CLEAR: lt_act, lt_exp.


f_cut->get_associated_apps( EXPORTING
iv_wda_name = `WDR_TEST_EVENTS` IMPORTING
et_node_ids = lt_act ).

append_unique_id( EXPORTING id = `Y_NW


BC_SP_DEFINITION:19` CHANGING unique_ids =
lt_exp ).

assert_equals( act = lt_act exp = lt_e


xp msg = 'Reading explicitly assigned side
panels by WDA name fails').

"*************************************
*************************

" search for explicitly assigned side


panels by WDA name with configuration

CLEAR: lt_act, lt_exp.


f_cut->get_associated_apps( EXPORTING
iv_wda_name = `WDR_CHIP_PAGE\FPM_TEST_CHIP
_PAGE_OIF` IMPORTING et_node_ids = lt_act
).

append_unique_id( EXPORTING id = `Y_NW


BC_SP_DEFINITION:25` CHANGING unique_ids =
lt_exp ).

assert_equals( act = lt_act exp = lt_e


xp msg = 'Reading explicitly assigned side
panels by WDA name and configuration fail
s').

"*************************************
*************************
" search for explicitly assigned side
panels by WDA name with configuration (no
pattern)

CLEAR: lt_act, lt_exp.

f_cut->get_associated_apps( EXPORTING
iv_wda_name = `FPM_WIRE_TEST_OVP\FPM_WIRE_
TEST_OVP_APPCC` IMPORTING et_node_ids = lt
_act ).

append_unique_id( EXPORTING id = `Y_NW


BC_SP_DEFINITION:23` CHANGING unique_ids =
lt_exp ).

assert_equals( act = lt_act exp = lt_e


xp msg = 'Reading explicitly assigned side
panels by WDA name and configuration (not
pattern) fails').
"*************************************
*************************

" search for explicitly assigned side


panels by Transaction name (not existing i
n tree)

CLEAR: lt_act, lt_exp.

f_cut->get_associated_apps( EXPORTING
iv_tr_name = `SE01` IMPORTING et_node_ids
= lt_act ).

append_unique_id( EXPORTING id = `Y_NW


BC_SP_DEFINITION:27` CHANGING unique_ids =
lt_exp ).
assert_equals( act = lt_act exp = lt_e
xp msg = 'Reading explicitly assigned side
panels by Transaction name (not int tree)
fails').

"*************************************
*************************

" search for explicitly assigned side


panels by Transaction name (existing in tr
ee)

CLEAR: lt_act, lt_exp.

f_cut->get_associated_apps( EXPORTING
iv_tr_name = `SE80` IMPORTING et_node_ids
= lt_act ).

append_unique_id( EXPORTING id = `Y_NW


BC_SP_DEFINITION:21` CHANGING unique_ids =
lt_exp ).
append_unique_id( EXPORTING id = `Y_NW
BC_SP_DEFINITION:12` CHANGING unique_ids =
lt_exp ).

SORT: lt_act, lt_exp.

assert_equals( act = lt_act exp = lt_e


xp msg = 'Reading explicitly assigned side
panels by Transaction name fails').

"*************************************
*************************

" search for explicitly assigned side


panels fully qualified url (WDA)

CLEAR: lt_act, lt_exp.


DATA: lv_url TYPE string.

CONCATENATE f_cut->if_nwbc_runtime~ful
l_qualified_host `/sap/bc/webdynpro/SAP/FP
M_WIRE_TEST_OVP?sap-wd-configId=FPM_WIRE_T
EST_OVP_APPCC&sap-client=` sy-mandt `&sap-
language=EN` INTO lv_url.

f_cut->get_associated_apps( EXPORTING
iv_url = lv_url IMPORTING et_node_ids = lt
_act ).

append_unique_id( EXPORTING id = `Y_NW


BC_SP_DEFINITION:23` CHANGING unique_ids =
lt_exp ).
assert_equals( act = lt_act exp = lt_e
xp msg = 'Reading explicitly assigned side
panels by fully qualified url fails').

"*************************************
*************************

" search for explicitly assigned side


panels relative url (TR)

CLEAR: lt_act, lt_exp.

CONCATENATE `/sap/bc/gui/sap/its/webgu
i;~sysid=` sy-sysid `;~service=3278?~trans
action=SE11&~nosplash=1&sap-client=` sy-ma
ndt `&sap-language=EN` INTO lv_url.

f_cut->get_associated_apps( EXPORTING
iv_url = lv_url IMPORTING et_node_ids = lt
_act ).

append_unique_id( EXPORTING id = `Y_NW


BC_SP_DEFINITION:9` CHANGING unique_ids =
lt_exp ).

assert_equals( act = lt_act exp = lt_e


xp msg = 'Reading explicitly assigned side
panels by relative url fails').

ENDMETHOD. "get_Associated_Apps
METHOD get_associated_links.

DATA: lt_act TYPE if_nwbc_runtime35=>t


_unique_ids,

lt_exp LIKE lt_act.

"*************************************
*************************

" search for all side panels asigned e


ntries in specific role

CLEAR: lt_act, lt_exp.


f_cut->get_associated_links( EXPORTING
iv_role = `Y_NWBC_LC_TEST1` IMPORTING et_
node_ids = lt_act ).

append_unique_id( EXPORTING id = `Y_NW


BC_LC_TEST1:62` CHANGING unique_ids = lt_
exp ).

append_unique_id( EXPORTING id = `Y_NW


BC_LC_TEST1:46` CHANGING unique_ids = lt_
exp ).

append_unique_id( EXPORTING id = `Y_NW


BC_LC_TEST1:45` CHANGING unique_ids = lt_
exp ).

append_unique_id( EXPORTING id = `Y_NW


BC_LC_TEST1:59` CHANGING unique_ids = lt_
exp ).

append_unique_id( EXPORTING id = `Y_NW


BC_LC_TEST1:68` CHANGING unique_ids = lt_
exp ).

append_unique_id( EXPORTING id = `Y_NW


BC_LC_TEST1:63` CHANGING unique_ids = lt_
exp ).
append_unique_id( EXPORTING id = `Y_NW
BC_LC_TEST1:61` CHANGING unique_ids = lt_
exp ).

append_unique_id( EXPORTING id = `Y_NW


BC_LC_TEST1:67` CHANGING unique_ids = lt_
exp ).

append_unique_id( EXPORTING id = `Y_NW


BC_LC_TEST1:70` CHANGING unique_ids = lt_
exp ).

append_unique_id( EXPORTING id = `Y_NW


BC_LC_TEST1:69` CHANGING unique_ids = lt_
exp ).

append_unique_id( EXPORTING id = `Y_NW


BC_LC_TEST1:58` CHANGING unique_ids = lt_
exp ).

append_unique_id( EXPORTING id = `Y_NW


BC_LC_TEST1:71` CHANGING unique_ids = lt_
exp ).

SORT: lt_act, lt_exp.

assert_equals( act = lt_act exp = lt_e


xp msg = 'Reading of link collections for
role entries fails').
"*************************************
*************************

" search for inherited link collection


s by unique id (assignment by name)

DATA: lv_unique_id TYPE string.

CLEAR: lt_act, lt_exp.

lv_unique_id = cl_nwbc_runtime35=>enco
de_unique_id( agr_name = `Y_NWBC_LC_TEST1`
origin_id = `64` ).

f_cut->get_associated_links( EXPORTING
iv_unique_id = lv_unique_id IMPORTING et_
node_ids = lt_act ).
append_unique_id( EXPORTING id = `Y_NW
BC_LC_TEST1:62` CHANGING unique_ids = lt_e
xp ).

append_unique_id( EXPORTING id = `Y_NW


BC_LC_TEST1:59` CHANGING unique_ids = lt_e
xp ).

append_unique_id( EXPORTING id = `Y_NW


BC_LC_TEST1:68` CHANGING unique_ids = lt_e
xp ).

append_unique_id( EXPORTING id = `Y_NW


BC_LC_TEST1:63` CHANGING unique_ids = lt_e
xp ).

append_unique_id( EXPORTING id = `Y_NW


BC_LC_TEST1:67` CHANGING unique_ids = lt_e
xp ).

append_unique_id( EXPORTING id = `Y_NW


BC_LC_TEST1:70` CHANGING unique_ids = lt_e
xp ).

append_unique_id( EXPORTING id = `Y_NW


BC_LC_TEST1:69` CHANGING unique_ids = lt_e
xp ).

append_unique_id( EXPORTING id = `Y_NW


BC_LC_TEST1:58` CHANGING unique_ids = lt_e
xp ).
append_unique_id( EXPORTING id = `Y_NW
BC_LC_TEST1:71` CHANGING unique_ids = lt_e
xp ).

SORT: lt_act, lt_exp.

assert_equals( act = lt_act exp = lt_e


xp msg = 'Reading the inherited link colle
ctions by unique id fails').

"*************************************
*************************

" search for explicitly assigned link


collections by unique id (assignment by no
de id)

CLEAR: lt_act, lt_exp.


lv_unique_id = cl_nwbc_runtime35=>enco
de_unique_id( agr_name = `Y_NWBC_LC_TEST1`
origin_id = `16` ).

f_cut->get_associated_links( EXPORTING
iv_unique_id = lv_unique_id IMPORTING et_
node_ids = lt_act ).

append_unique_id( EXPORTING id = `Y_NW


BC_LC_TEST1:62` CHANGING unique_ids = lt_e
xp ).

append_unique_id( EXPORTING id = `Y_NW


BC_LC_TEST1:46` CHANGING unique_ids = lt_e
xp ).

append_unique_id( EXPORTING id = `Y_NW


BC_LC_TEST1:45` CHANGING unique_ids = lt_e
xp ).

append_unique_id( EXPORTING id = `Y_NW


BC_LC_TEST1:59` CHANGING unique_ids = lt_e
xp ).

append_unique_id( EXPORTING id = `Y_NW


BC_LC_TEST1:68` CHANGING unique_ids = lt_e
xp ).
append_unique_id( EXPORTING id = `Y_NW
BC_LC_TEST1:63` CHANGING unique_ids = lt_e
xp ).

append_unique_id( EXPORTING id = `Y_NW


BC_LC_TEST1:70` CHANGING unique_ids = lt_e
xp ).

append_unique_id( EXPORTING id = `Y_NW


BC_LC_TEST1:69` CHANGING unique_ids = lt_e
xp ).

append_unique_id( EXPORTING id = `Y_NW


BC_LC_TEST1:58` CHANGING unique_ids = lt_e
xp ).

append_unique_id( EXPORTING id = `Y_NW


BC_LC_TEST1:71` CHANGING unique_ids = lt_e
xp ).

SORT: lt_act, lt_exp.

assert_equals( act = lt_act exp = lt_e


xp msg = 'Reading the inherited link colle
ctions by unique id fails').
"*************************************
*************************

" search for explicitly assigned side


panels by Transaction name (existing in tr
ee)

CLEAR: lt_act, lt_exp.

f_cut->get_associated_links( EXPORTING
iv_tr_name = `SE38` IMPORTING et_node_ids
= lt_act ).

append_unique_id( EXPORTING id = `Y_NW


BC_LC_TEST1:67` CHANGING unique_ids = lt_e
xp ).
assert_equals( act = lt_act exp = lt_e
xp msg = 'Reading link collections by Tran
saction name fails').

"*************************************
*************************

" search for explicitly assigned link


collection by relative url (TR)

CLEAR: lt_act, lt_exp.

DATA: lv_url TYPE string.

CONCATENATE `/sap/bc/gui/sap/its/webgu
i;~sysid=` sy-sysid `;~service=3278?~trans
action=SE38&~nosplash=1&sap-client=` sy-ma
ndt `&sap-language=EN` INTO lv_url.
f_cut->get_associated_links( EXPORTING
iv_url = lv_url IMPORTING et_node_ids = l
t_act ).

append_unique_id( EXPORTING id = `Y_NW


BC_LC_TEST1:67` CHANGING unique_ids = lt_e
xp ).

assert_equals( act = lt_act exp = lt_e


xp msg = 'Reading link collection by relat
ive url fails').

ENDMETHOD. "get_Associated_Links
METHOD get_associated_searches.

DATA: lt_act TYPE if_nwbc_runtime35=>t


_unique_ids,

lt_exp LIKE lt_act.

"*************************************
*************************

" search for all search providers asig


ned
CLEAR: lt_act, lt_exp.

f_cut->get_associated_searches( IMPORT
ING et_node_ids = lt_act ).

append_unique_id( EXPORTING id = `Y_NW


BC_SEARCH_TEST1:5` CHANGING unique_ids =
lt_exp ).

append_unique_id( EXPORTING id = `Y_NW


BC_SEARCH_TEST1:3` CHANGING unique_ids =
lt_exp ).

SORT: lt_act, lt_exp.

assert_equals( act = lt_act exp = lt_e


xp msg = 'Reading of search providers for
all entries fails').

"*************************************
*************************

" check for global search providers as


igned to any node

CLEAR: lt_act, lt_exp.

f_cut->get_associated_searches( EXPORT
ING iv_unique_id = `Y_NWBC_LC_TEST1:15` IM
PORTING et_node_ids = lt_act ).

append_unique_id( EXPORTING id = `Y_NW


BC_SEARCH_TEST1:5` CHANGING unique_ids =
lt_exp ).
assert_equals( act = lt_act exp = lt_e
xp msg = 'Reading of global search provide
rs for node fails').

"*************************************
*************************

" check for explicit search providers


asigned to specific WDA

CLEAR: lt_act, lt_exp.

f_cut->get_associated_searches( EXPORT
ING iv_wda_name = `WDR_TEST_EVENTS` IMPORT
ING et_node_ids = lt_act ).
append_unique_id( EXPORTING id = `Y_NW
BC_SEARCH_TEST1:5` CHANGING unique_ids =
lt_exp ).

append_unique_id( EXPORTING id = `Y_NW


BC_SEARCH_TEST1:3` CHANGING unique_ids =
lt_exp ).

SORT: lt_act, lt_exp.

assert_equals( act = lt_act exp = lt_e


xp msg = 'Reading of explicit search provi
ders for WDA fails').

ENDMETHOD. "get_Associated_Searche
s
ENDCLASS. "lc_ut_associated

LIMU
CINC
CL_NWBC_RUNTIME35=============CCIMP

00010

LIMU
CINC
CL_NWBC_RUNTIME35=============CCIMP

00000

31
1
\\\\\no_empty_blocks/////
1
\\\\\comments_ignored/////
1
\\\\\delta_normalized/////
3
\\\\\allowed/////
FORM
*
3
\\\\\allowed/////
FUNCTION
*
3
\\\\\allowed/////
MODULE
**
3
\\\\\allowed/////
REPORT
*
3
\\\\\allowed/////
PROGRAM
*
3
\\\\\allowed/////
FUNCTION-POOL
*
3
\\\\\allowed/////
AT
LINE-SELECTION
3
\\\\\allowed/////
AT
USER-COMMAND
4
\\\\\allowed/////
AT
SELECTION-SCREEN
**
3
\\\\\allowed/////
AT
PF*
2
\\\\\allowed/////
INITIALIZATION
2
\\\\\allowed/////
START-OF-SELECTION
2
\\\\\allowed/////
END-OF-SELECTION
3
\\\\\allowed/////
TOP-OF-PAGE
**
2
\\\\\allowed/////
END-OF-PAGE
3
\\\\\allowed/////
GET
**
3
\\\\\forbidden/////
GET
BADI
3
\\\\\forbidden/////
GET
BIT
3
\\\\\forbidden/////
GET
CONNECTION
3
\\\\\forbidden/////
GET
CURSOR
3
\\\\\forbidden/////
GET
DATASET
3
\\\\\forbidden/////
GET
LOCALE
3
\\\\\forbidden/////
GET
PARAMETER
3
\\\\\forbidden/////
GET
PF-STATUS
3
\\\\\forbidden/////
GET
PROPERTY
3
\\\\\forbidden/////
GET
REFERENCE
3
\\\\\forbidden/////
GET
RUN
3
\\\\\forbidden/////
GET
TIME
1
0
3
315
4
ENDMETHOD. "create_ta
ble

ENDCLASS. "lcl_nwbc_nav
_tree_access IMPLEMENTATION

*-----------------------------------------
-----------------------------*

1
* CLASS lc_ut_associated DEFINITION
1
* CLASS cl_get_navigation_trees_test
DEFINITION

319
3
*-----------------------------------------
-----------------------------*

*-----------------------------------------
-----------------------------*

57

CLASS lc_ut_associated DEFINITION FOR TEST


ING.

" DURATION SHORT RISK LEVEL HARMLESS ->


noit supported on 700

*?#<asx:abap xmlns:asx="http://www.sap.com
/abapxml" version="1.0">
*?<asx:values>

*?<TESTCLASS_OPTIONS>

*?<TEST_CLASS>lc_ut_associated

*?</TEST_CLASS>

*?<TEST_MEMBER>f_Cut

*?</TEST_MEMBER>

*?<OBJECT_UNDER_TEST>CL_NWBC_RUNTIME35

*?</OBJECT_UNDER_TEST>

*?<OBJECT_IS_LOCAL/>
*?<GENERATE_FIXTURE>X

*?</GENERATE_FIXTURE>

*?<GENERATE_CLASS_FIXTURE>X

*?</GENERATE_CLASS_FIXTURE>

*?<GENERATE_INVOCATION>X

*?</GENERATE_INVOCATION>

*?<GENERATE_ASSERT_EQUAL>X

*?</GENERATE_ASSERT_EQUAL>

*?</TESTCLASS_OPTIONS>
*?</asx:values>

*?</asx:abap>

PRIVATE SECTION.

* ================

DATA: f_cut TYPE REF TO if_nwbc_runtim


e35. "class under test

CONSTANTS: mc_associated_role TYPE agr


_name VALUE 'Y_NWBC_ASSOCIATED'.
METHODS:

setup,

teardown,

assert_equals IMPORTING act TYPE any

exp TYPE any

msg TYPE cse


quence OPTIONAL

level TYPE aun


it_level DEFAULT if_aunit_constants=>criti
cal

RETURNING value(assertio
n_failed) TYPE abap_bool,

append_unique_id IMPORTING agr_name


TYPE agr_name OPTIONAL

origin_id
TYPE string OPTIONAL

id
TYPE string OPTIONAL

CHANGING unique_ids
TYPE if_nwbc_runtime35=>t_unique_ids,

get_associated_apps FOR TESTING,


get_associated_links FOR TESTING,

get_associated_searches FOR TESTING.

ENDCLASS. "lc_ut_associated

CLASS cl_nwbc_runtime35 DEFINITION LOCAL F


RIENDS lc_ut_associated.

*-----------------------------------------
-----------------------------*
* CLASS lc_ut_associated IMPLEMENTAT
ION

13
CLASS cl_get_navigation_trees_test DEFINIT
ION FOR TESTING FINAL

" DURATION SHORT RISK LEVEL HARMLESS ->


not supported on 700

"#AU Duration Short

"#AU Risk_Level Harmless

PRIVATE SECTION.

METHODS: test_sap_menu FOR TESTING,


test_favorites FOR TESTING,

check_on_sap_menu_favorites I
MPORTING navigation_tree TYPE if_nwbc_runt
ime=>t_navigation_tree.

ENDCLASS. "cl_get_navig
ation_trees_test DEFINITION

*-----------------------------------------
-----------------------------*

* CLASS cl_get_navigation_trees_test
IMPLEMENTATION

379
3
*-----------------------------------------
-----------------------------*

*-----------------------------------------
-----------------------------*

343
CLASS lc_ut_associated IMPLEMENTATION.

* ========================================

METHOD setup.

DATA: i35version TYPE i,

lv_role_exist TYPE abap_bool,

lv_role_filter TYPE string.


lv_role_exist = cl_nwbc_runtime35=>is_
role_exist( mc_associated_role ).

IF lv_role_exist EQ abap_false.

DATA: lv_detail TYPE string.

CONCATENATE `Please import role ` mc


_associated_role ` from Y3S(111) system in
to ` sy-sysid `(` sy-mandt `)` ` to proces
s unit tests.` INTO lv_detail.

cl_aunit_assert=>abort( msg = `Test


role is not available.` detail = lv_detail
).

ENDIF.

i35version = cl_nwbc=>get_runtime
_iversion( if_nwbc_runtime35=>version ).

lv_role_filter = mc_associated_role.
f_cut ?= cl_nwbc_factory=>get_nwbc_run
time( iv_cockpit = if_nwbc_runtime=>c
ockpit_role_filter_alias

iv_role_filter = lv_role_filte
r

iv_version = i35version ).

ENDMETHOD. "setup
METHOD teardown.

ENDMETHOD. "teardown

METHOD assert_equals.

assertion_failed = cl_aunit_assert=>as
sert_equals( act = act exp = exp msg = msg
level = level ).

ENDMETHOD. "assert_eq
uals

METHOD append_unique_id.
DATA: lv_agr_name TYPE agr_name,

lv_origin_id TYPE string.

FIELD-SYMBOLS: <fs> LIKE LINE OF uniqu


e_ids.

APPEND INITIAL LINE TO unique_ids ASSI


GNING <fs>.
IF id IS NOT INITIAL.

SPLIT id AT `:` INTO lv_agr_name lv_


origin_id.

ELSE.

lv_agr_name = agr_name.

lv_origin_id = origin_id.

ENDIF.

<fs> = cl_nwbc_runtime35=>encode_uniqu
e_id( agr_name = lv_agr_name origin_id = l
v_origin_id ).
ENDMETHOD.

METHOD get_associated_apps.

DATA: lt_act TYPE if_nwbc_runtime35=>t


_unique_ids,

lt_exp LIKE lt_act.


"*************************************
*************************

" search for all side panels asigned e


ntries in specific role

CLEAR: lt_act, lt_exp.

f_cut->get_associated_apps( EXPORTING
iv_role = `Y_NWBC_SP_TEST2` IMPORTING et_n
ode_ids = lt_act ).

append_unique_id( EXPORTING id = `Y_NW


BC_SP_DEFINITION:10` CHANGING unique_ids
= lt_exp ).

append_unique_id( EXPORTING id = `Y_NW


BC_SP_DEFINITION:6` CHANGING unique_ids
= lt_exp ).

append_unique_id( EXPORTING id = `Y_NW


BC_SP_DEFINITION:7` CHANGING unique_ids
= lt_exp ).
append_unique_id( EXPORTING id = `Y_NW
BC_SP_TEST2:14` CHANGING unique_ids
= lt_exp ).

append_unique_id( EXPORTING id = `Y_NW


BC_SP_DEFINITION:21` CHANGING unique_ids
= lt_exp ).

append_unique_id( EXPORTING id = `Y_NW


BC_SP_DEFINITION:12` CHANGING unique_ids
= lt_exp ).

SORT: lt_act, lt_exp.

assert_equals( act = lt_act exp = lt_e


xp msg = 'Reading of side panels for role
entries fails').

DATA: lv_unique_id TYPE string.


"*************************************
*************************

" search for inherited side panels by


unique id (assignment by name)

CLEAR: lt_act, lt_exp.

lv_unique_id = cl_nwbc_runtime35=>enco
de_unique_id( agr_name = `Y_NWBC_SP_TEST1`
origin_id = `18` ).

f_cut->get_associated_apps( EXPORTING
iv_unique_id = lv_unique_id IMPORTING et_n
ode_ids = lt_act ).
append_unique_id( EXPORTING id = `Y_NW
BC_SP_TEST1:59` CHANGING unique_ids = lt_e
xp ).

append_unique_id( EXPORTING id = `Y_NW


BC_SP_TEST1:63` CHANGING unique_ids = lt_e
xp ).

SORT: lt_act, lt_exp.

assert_equals( act = lt_act exp = lt_e


xp msg = 'Reading the inherited side panel
s by unique id fails').

"*************************************
*************************

" search for explicitly assigned side


panels by unique id
CLEAR: lt_act, lt_exp.

lv_unique_id = cl_nwbc_runtime35=>enco
de_unique_id( agr_name = `Y_NWBC_SP_TEST2`
origin_id = `5` ).

f_cut->get_associated_apps( EXPORTING
iv_unique_id = lv_unique_id IMPORTING et_n
ode_ids = lt_act ).

append_unique_id( EXPORTING id = `Y_NW


BC_SP_DEFINITION:9` CHANGING unique_ids =
lt_exp ).

assert_equals( act = lt_act exp = lt_e


xp msg = 'Reading explicitly assigned side
panels by unique id fails').
"*************************************
*************************

" search for explicitly assigned side


panels by unique id (assignment by node)

CLEAR: lt_act, lt_exp.

lv_unique_id = cl_nwbc_runtime35=>enco
de_unique_id( agr_name = `Y_NWBC_SP_TEST1`
origin_id = `22` ).

f_cut->get_associated_apps( EXPORTING
iv_unique_id = lv_unique_id IMPORTING et_n
ode_ids = lt_act ).

append_unique_id( EXPORTING id = `Y_NW


BC_SP_TEST1:59` CHANGING unique_ids = lt_e
xp ).
append_unique_id( EXPORTING id = `Y_NW
BC_SP_TEST1:63` CHANGING unique_ids = lt_e
xp ).

append_unique_id( EXPORTING id = `Y_NW


BC_SP_TEST1:45` CHANGING unique_ids = lt_e
xp ).

SORT: lt_act, lt_exp.

assert_equals( act = lt_act exp = lt_e


xp msg = 'Reading explicitly assigned (by
node id) side panels by unique id fails').

"*************************************
*************************
" search for explicitly assigned side
panels by WDA name without configuration

CLEAR: lt_act, lt_exp.

f_cut->get_associated_apps( EXPORTING
iv_wda_name = `WDR_TEST_EVENTS` IMPORTING
et_node_ids = lt_act ).

append_unique_id( EXPORTING id = `Y_NW


BC_SP_DEFINITION:19` CHANGING unique_ids =
lt_exp ).

assert_equals( act = lt_act exp = lt_e


xp msg = 'Reading explicitly assigned side
panels by WDA name fails').
"*************************************
*************************

" search for explicitly assigned side


panels by WDA name with configuration

CLEAR: lt_act, lt_exp.

f_cut->get_associated_apps( EXPORTING
iv_wda_name = `WDR_CHIP_PAGE\FPM_TEST_CHIP
_PAGE_OIF` IMPORTING et_node_ids = lt_act
).

append_unique_id( EXPORTING id = `Y_NW


BC_SP_DEFINITION:25` CHANGING unique_ids =
lt_exp ).

assert_equals( act = lt_act exp = lt_e


xp msg = 'Reading explicitly assigned side
panels by WDA name and configuration fail
s').

"*************************************
*************************

" search for explicitly assigned side


panels by WDA name with configuration (no
pattern)

CLEAR: lt_act, lt_exp.

f_cut->get_associated_apps( EXPORTING
iv_wda_name = `FPM_WIRE_TEST_OVP\FPM_WIRE_
TEST_OVP_APPCC` IMPORTING et_node_ids = lt
_act ).

append_unique_id( EXPORTING id = `Y_NW


BC_SP_DEFINITION:23` CHANGING unique_ids =
lt_exp ).
assert_equals( act = lt_act exp = lt_e
xp msg = 'Reading explicitly assigned side
panels by WDA name and configuration (not
pattern) fails').

"*************************************
*************************

" search for explicitly assigned side


panels by Transaction name (not existing i
n tree)

CLEAR: lt_act, lt_exp.

f_cut->get_associated_apps( EXPORTING
iv_tr_name = `SE01` IMPORTING et_node_ids
= lt_act ).
append_unique_id( EXPORTING id = `Y_NW
BC_SP_DEFINITION:27` CHANGING unique_ids =
lt_exp ).

assert_equals( act = lt_act exp = lt_e


xp msg = 'Reading explicitly assigned side
panels by Transaction name (not int tree)
fails').

"*************************************
*************************

" search for explicitly assigned side


panels by Transaction name (existing in tr
ee)

CLEAR: lt_act, lt_exp.


f_cut->get_associated_apps( EXPORTING
iv_tr_name = `SE80` IMPORTING et_node_ids
= lt_act ).

append_unique_id( EXPORTING id = `Y_NW


BC_SP_DEFINITION:21` CHANGING unique_ids =
lt_exp ).

append_unique_id( EXPORTING id = `Y_NW


BC_SP_DEFINITION:12` CHANGING unique_ids =
lt_exp ).

SORT: lt_act, lt_exp.

assert_equals( act = lt_act exp = lt_e


xp msg = 'Reading explicitly assigned side
panels by Transaction name fails').
"*************************************
*************************

" search for explicitly assigned side


panels fully qualified url (WDA)

CLEAR: lt_act, lt_exp.

DATA: lv_url TYPE string.

CONCATENATE f_cut->if_nwbc_runtime~ful
l_qualified_host `/sap/bc/webdynpro/SAP/FP
M_WIRE_TEST_OVP?sap-wd-configId=FPM_WIRE_T
EST_OVP_APPCC&sap-client=` sy-mandt `&sap-
language=EN` INTO lv_url.
f_cut->get_associated_apps( EXPORTING
iv_url = lv_url IMPORTING et_node_ids = lt
_act ).

append_unique_id( EXPORTING id = `Y_NW


BC_SP_DEFINITION:23` CHANGING unique_ids =
lt_exp ).

assert_equals( act = lt_act exp = lt_e


xp msg = 'Reading explicitly assigned side
panels by fully qualified url fails').

"*************************************
*************************

" search for explicitly assigned side


panels relative url (TR)

CLEAR: lt_act, lt_exp.


CONCATENATE `/sap/bc/gui/sap/its/webgu
i;~sysid=` sy-sysid `;~service=3278?~trans
action=SE11&~nosplash=1&sap-client=` sy-ma
ndt `&sap-language=EN` INTO lv_url.

f_cut->get_associated_apps( EXPORTING
iv_url = lv_url IMPORTING et_node_ids = lt
_act ).

append_unique_id( EXPORTING id = `Y_NW


BC_SP_DEFINITION:9` CHANGING unique_ids =
lt_exp ).

assert_equals( act = lt_act exp = lt_e


xp msg = 'Reading explicitly assigned side
panels by relative url fails').
ENDMETHOD. "get_Associated_Apps

METHOD get_associated_links.

DATA: lt_act TYPE if_nwbc_runtime35=>t


_unique_ids,

lt_exp LIKE lt_act.


"*************************************
*************************

" search for all side panels asigned e


ntries in specific role

CLEAR: lt_act, lt_exp.

f_cut->get_associated_links( EXPORTING
iv_role = `Y_NWBC_LC_TEST1` IMPORTING et_
node_ids = lt_act ).

append_unique_id( EXPORTING id = `Y_NW


BC_LC_TEST1:62` CHANGING unique_ids = lt_
exp ).

append_unique_id( EXPORTING id = `Y_NW


BC_LC_TEST1:46` CHANGING unique_ids = lt_
exp ).

append_unique_id( EXPORTING id = `Y_NW


BC_LC_TEST1:45` CHANGING unique_ids = lt_
exp ).

append_unique_id( EXPORTING id = `Y_NW


BC_LC_TEST1:59` CHANGING unique_ids = lt_
exp ).

append_unique_id( EXPORTING id = `Y_NW


BC_LC_TEST1:68` CHANGING unique_ids = lt_
exp ).

append_unique_id( EXPORTING id = `Y_NW


BC_LC_TEST1:63` CHANGING unique_ids = lt_
exp ).

append_unique_id( EXPORTING id = `Y_NW


BC_LC_TEST1:61` CHANGING unique_ids = lt_
exp ).

append_unique_id( EXPORTING id = `Y_NW


BC_LC_TEST1:67` CHANGING unique_ids = lt_
exp ).

append_unique_id( EXPORTING id = `Y_NW


BC_LC_TEST1:70` CHANGING unique_ids = lt_
exp ).

append_unique_id( EXPORTING id = `Y_NW


BC_LC_TEST1:69` CHANGING unique_ids = lt_
exp ).

append_unique_id( EXPORTING id = `Y_NW


BC_LC_TEST1:58` CHANGING unique_ids = lt_
exp ).
append_unique_id( EXPORTING id = `Y_NW
BC_LC_TEST1:71` CHANGING unique_ids = lt_
exp ).

SORT: lt_act, lt_exp.

assert_equals( act = lt_act exp = lt_e


xp msg = 'Reading of link collections for
role entries fails').

"*************************************
*************************

" search for inherited link collection


s by unique id (assignment by name)

DATA: lv_unique_id TYPE string.


CLEAR: lt_act, lt_exp.

lv_unique_id = cl_nwbc_runtime35=>enco
de_unique_id( agr_name = `Y_NWBC_LC_TEST1`
origin_id = `64` ).

f_cut->get_associated_links( EXPORTING
iv_unique_id = lv_unique_id IMPORTING et_
node_ids = lt_act ).

append_unique_id( EXPORTING id = `Y_NW


BC_LC_TEST1:62` CHANGING unique_ids = lt_e
xp ).

append_unique_id( EXPORTING id = `Y_NW


BC_LC_TEST1:59` CHANGING unique_ids = lt_e
xp ).

append_unique_id( EXPORTING id = `Y_NW


BC_LC_TEST1:68` CHANGING unique_ids = lt_e
xp ).
append_unique_id( EXPORTING id = `Y_NW
BC_LC_TEST1:63` CHANGING unique_ids = lt_e
xp ).

append_unique_id( EXPORTING id = `Y_NW


BC_LC_TEST1:67` CHANGING unique_ids = lt_e
xp ).

append_unique_id( EXPORTING id = `Y_NW


BC_LC_TEST1:70` CHANGING unique_ids = lt_e
xp ).

append_unique_id( EXPORTING id = `Y_NW


BC_LC_TEST1:69` CHANGING unique_ids = lt_e
xp ).

append_unique_id( EXPORTING id = `Y_NW


BC_LC_TEST1:58` CHANGING unique_ids = lt_e
xp ).

append_unique_id( EXPORTING id = `Y_NW


BC_LC_TEST1:71` CHANGING unique_ids = lt_e
xp ).

SORT: lt_act, lt_exp.


assert_equals( act = lt_act exp = lt_e
xp msg = 'Reading the inherited link colle
ctions by unique id fails').

"*************************************
*************************

" search for explicitly assigned link


collections by unique id (assignment by no
de id)

CLEAR: lt_act, lt_exp.

lv_unique_id = cl_nwbc_runtime35=>enco
de_unique_id( agr_name = `Y_NWBC_LC_TEST1`
origin_id = `16` ).

f_cut->get_associated_links( EXPORTING
iv_unique_id = lv_unique_id IMPORTING et_
node_ids = lt_act ).
append_unique_id( EXPORTING id = `Y_NW
BC_LC_TEST1:62` CHANGING unique_ids = lt_e
xp ).

append_unique_id( EXPORTING id = `Y_NW


BC_LC_TEST1:46` CHANGING unique_ids = lt_e
xp ).

append_unique_id( EXPORTING id = `Y_NW


BC_LC_TEST1:45` CHANGING unique_ids = lt_e
xp ).

append_unique_id( EXPORTING id = `Y_NW


BC_LC_TEST1:59` CHANGING unique_ids = lt_e
xp ).

append_unique_id( EXPORTING id = `Y_NW


BC_LC_TEST1:68` CHANGING unique_ids = lt_e
xp ).

append_unique_id( EXPORTING id = `Y_NW


BC_LC_TEST1:63` CHANGING unique_ids = lt_e
xp ).

append_unique_id( EXPORTING id = `Y_NW


BC_LC_TEST1:70` CHANGING unique_ids = lt_e
xp ).

append_unique_id( EXPORTING id = `Y_NW


BC_LC_TEST1:69` CHANGING unique_ids = lt_e
xp ).
append_unique_id( EXPORTING id = `Y_NW
BC_LC_TEST1:58` CHANGING unique_ids = lt_e
xp ).

append_unique_id( EXPORTING id = `Y_NW


BC_LC_TEST1:71` CHANGING unique_ids = lt_e
xp ).

SORT: lt_act, lt_exp.

assert_equals( act = lt_act exp = lt_e


xp msg = 'Reading the inherited link colle
ctions by unique id fails').

"*************************************
*************************

" search for explicitly assigned side


panels by Transaction name (existing in tr
ee)

CLEAR: lt_act, lt_exp.

f_cut->get_associated_links( EXPORTING
iv_tr_name = `SE38` IMPORTING et_node_ids
= lt_act ).

append_unique_id( EXPORTING id = `Y_NW


BC_LC_TEST1:67` CHANGING unique_ids = lt_e
xp ).

assert_equals( act = lt_act exp = lt_e


xp msg = 'Reading link collections by Tran
saction name fails').
"*************************************
*************************

" search for explicitly assigned link


collection by relative url (TR)

CLEAR: lt_act, lt_exp.

DATA: lv_url TYPE string.

CONCATENATE `/sap/bc/gui/sap/its/webgu
i;~sysid=` sy-sysid `;~service=3278?~trans
action=SE38&~nosplash=1&sap-client=` sy-ma
ndt `&sap-language=EN` INTO lv_url.

f_cut->get_associated_links( EXPORTING
iv_url = lv_url IMPORTING et_node_ids = l
t_act ).
append_unique_id( EXPORTING id = `Y_NW
BC_LC_TEST1:67` CHANGING unique_ids = lt_e
xp ).

assert_equals( act = lt_act exp = lt_e


xp msg = 'Reading link collection by relat
ive url fails').

ENDMETHOD. "get_Associated_Links
METHOD get_associated_searches.

DATA: lt_act TYPE if_nwbc_runtime35=>t


_unique_ids,

lt_exp LIKE lt_act.

"*************************************
*************************

" search for all search providers asig


ned

CLEAR: lt_act, lt_exp.


f_cut->get_associated_searches( IMPORT
ING et_node_ids = lt_act ).

append_unique_id( EXPORTING id = `Y_NW


BC_SEARCH_TEST1:5` CHANGING unique_ids =
lt_exp ).

append_unique_id( EXPORTING id = `Y_NW


BC_SEARCH_TEST1:3` CHANGING unique_ids =
lt_exp ).

SORT: lt_act, lt_exp.

assert_equals( act = lt_act exp = lt_e


xp msg = 'Reading of search providers for
all entries fails').
"*************************************
*************************

" check for global search providers as


igned to any node

CLEAR: lt_act, lt_exp.

f_cut->get_associated_searches( EXPORT
ING iv_unique_id = `Y_NWBC_LC_TEST1:15` IM
PORTING et_node_ids = lt_act ).

append_unique_id( EXPORTING id = `Y_NW


BC_SEARCH_TEST1:5` CHANGING unique_ids =
lt_exp ).
assert_equals( act = lt_act exp = lt_e
xp msg = 'Reading of global search provide
rs for node fails').

"*************************************
*************************

" check for explicit search providers


asigned to specific WDA

CLEAR: lt_act, lt_exp.

f_cut->get_associated_searches( EXPORT
ING iv_wda_name = `WDR_TEST_EVENTS` IMPORT
ING et_node_ids = lt_act ).

append_unique_id( EXPORTING id = `Y_NW


BC_SEARCH_TEST1:5` CHANGING unique_ids =
lt_exp ).

append_unique_id( EXPORTING id = `Y_NW


BC_SEARCH_TEST1:3` CHANGING unique_ids =
lt_exp ).

SORT: lt_act, lt_exp.

assert_equals( act = lt_act exp = lt_e


xp msg = 'Reading of explicit search provi
ders for WDA fails').

ENDMETHOD. "get_Associated_Searche
s
ENDCLASS. "lc_ut_associated

226
CLASS cl_get_navigation_trees_test IMPLEME
NTATION.

METHOD test_sap_menu.

DATA: lo_nwbc_runtime TYPE REF TO if_n


wbc_runtime,

lo_nwbc_runtime35 TYPE REF TO if


_nwbc_runtime35,

lo_cl_nwbc_runtime TYPE REF TO c


l_nwbc_runtime35,

lt_sap_menu TYPE if_nwbc_runtime


=>t_navigation_tree,

ls_sap_menu_info TYPE if_nwbc_ru


ntime=>t_navigation_tree_info,

ls_sap_menu_info_internal TYPE c
l_nwbc_runtime35=>t_sap_menu_info.
lo_nwbc_runtime = cl_nwbc_runtime35=>g
et( nwbc_shell = cl_nwbc=>for_html ).

lo_nwbc_runtime35 ?= lo_nwbc_runtime.

ASSERT lo_nwbc_runtime IS NOT INITIAL.

"get rid of any buffer

lo_cl_nwbc_runtime ?= lo_nwbc_runtime.

ls_sap_menu_info_internal = lo_cl_nwbc
_runtime->get_sap_menu_info( ).

DELETE FROM DATABASE nwbc_nav_tree(nt)


ID ls_sap_menu_info_internal-cluster_id.

DELETE FROM DATABASE nwbc_nav_tree(sn)


ID ls_sap_menu_info_internal-cluster_id.
DELETE FROM DATABASE nwbc_nav_tree(st)
ID ls_sap_menu_info_internal-cluster_id.

DELETE FROM DATABASE nwbc_nav_tree(su)


ID ls_sap_menu_info_internal-cluster_id.

"get interims sap menu

lo_nwbc_runtime35->get_navigation_tree
s( EXPORTING iv_request_sap_menu = abap_tr
ue

IMPORTING et_sap_menu = lt_sap_menu

es_sap_menu_info = ls_sap_menu_
info ).

READ TABLE lt_sap_menu TRANSPORTING NO


FIELDS WITH KEY children_not_loaded = aba
p_true.

IF sy-subrc EQ 0.

ASSERT ls_sap_menu_info-answer_cacha
ble = abap_false.
ELSE.

ASSERT ls_sap_menu_info-answer_cacha
ble = abap_true.

ENDIF.

me->check_on_sap_menu_favorites( EXPOR
TING navigation_tree = lt_sap_menu ).

DATA: ls_nwbc_nav_tree TYPE nwbc_nav_t


ree.

SELECT SINGLE * FROM nwbc_nav_tree INT


O ls_nwbc_nav_tree WHERE relid = 'SN'

AND uname = ls_sap_menu_in


fo_internal-cluster_id-uname

AND area_sap_menu = ls_sap_menu_in


fo_internal-cluster_id-extended_key
AND language = ls_sap_menu_in
fo_internal-cluster_id-language

AND show_tcode = ls_sap_menu_in


fo_internal-cluster_id-show_tcode

AND srtf2 = '0'.

IF sy-subrc EQ 0.

"wow - sap menu fetching in backgrou


nd job was very fast

ELSEIF ls_sap_menu_info-answer_cachabl
e EQ abap_false.

"background job still in progress

SELECT SINGLE * FROM nwbc_nav_tree I


NTO ls_nwbc_nav_tree WHERE relid = 'NT'

AND uname = ls_sap_menu_in


fo_internal-cluster_id-uname
AND area_sap_menu = ls_sap_menu_in
fo_internal-cluster_id-extended_key

AND language = ls_sap_menu_in


fo_internal-cluster_id-language

AND show_tcode = ls_sap_menu_in


fo_internal-cluster_id-show_tcode

AND srtf2 = '0'.

ASSERT ls_nwbc_nav_tree-nwbc_version
= if_nwbc_constants=>gc_s_nav_tree_cache-
loading

OR ls_nwbc_nav_tree-roles_key = if
_nwbc_constants=>gc_s_nav_tree_cache-null

OR ls_nwbc_nav_tree-roles_key = if
_nwbc_constants=>gc_s_nav_tree_cache-obsol
ete.

ENDIF.

sy-subrc = 4.
WHILE sy-subrc NE 0.

SELECT SINGLE * FROM nwbc_nav_tree I


NTO ls_nwbc_nav_tree WHERE relid = 'SN'

AND uname = ls_sap_menu_in


fo_internal-cluster_id-uname

AND area_sap_menu = ls_sap_menu_in


fo_internal-cluster_id-extended_key

AND language = ls_sap_menu_in


fo_internal-cluster_id-language

AND show_tcode = ls_sap_menu_in


fo_internal-cluster_id-show_tcode

AND srtf2 = '0'.

ENDWHILE.
"raw sap menu available => get full SA
P menu

CLEAR: lt_sap_menu, ls_sap_menu_info.

lo_nwbc_runtime = cl_nwbc_runtime35=>g
et( nwbc_shell = cl_nwbc=>for_html )."to t
hrough away session buffers

lo_nwbc_runtime35 ?= lo_nwbc_runtime.

lo_nwbc_runtime35->get_navigation_tree
s( EXPORTING iv_request_sap_menu = abap_tr
ue

IMPORTING et_sap_menu = lt_sap_menu

es_sap_menu_info = ls_sap_menu_info
).

ASSERT ls_sap_menu_info-answer_cachabl
e = abap_true.

me->check_on_sap_menu_favorites( EXPOR
TING navigation_tree = lt_sap_menu ).
SELECT SINGLE * FROM nwbc_nav_tree INT
O ls_nwbc_nav_tree WHERE relid = 'NT'

AND uname = ls_sap_menu_in


fo_internal-cluster_id-uname

AND area_sap_menu = ls_sap_menu_in


fo_internal-cluster_id-extended_key

AND language = ls_sap_menu_in


fo_internal-cluster_id-language

AND show_tcode = ls_sap_menu_in


fo_internal-cluster_id-show_tcode

AND srtf2 = '0'.

ASSERT ls_nwbc_nav_tree-nwbc_version N
E if_nwbc_constants=>gc_s_nav_tree_cache-l
oading

AND ls_nwbc_nav_tree-roles_key NE
if_nwbc_constants=>gc_s_nav_tree_cache-nul
l
AND ls_nwbc_nav_tree-roles_key NE
if_nwbc_constants=>gc_s_nav_tree_cache-obs
olete

AND sy-subrc EQ 0.

CALL FUNCTION 'DB_COMMIT'.

ENDMETHOD. "test_sap_
menu

METHOD test_favorites.

DATA: lo_nwbc_runtime TYPE REF TO if_n


wbc_runtime,

lo_nwbc_runtime35 TYPE REF TO if


_nwbc_runtime35,

lt_favorites TYPE if_nwbc_runtim


e=>t_navigation_tree,

ls_favorites_info TYPE if_nwbc_r


untime=>t_navigation_tree_info.
lo_nwbc_runtime = cl_nwbc_runtime35=>g
et( nwbc_shell = cl_nwbc=>for_html ).

lo_nwbc_runtime35 ?= lo_nwbc_runtime.

ASSERT lo_nwbc_runtime IS NOT INITIAL.

"get interims sap menu

lo_nwbc_runtime35->get_navigation_tree
s( EXPORTING iv_request_favorites = abap_t
rue

IMPORTING et_favorites = lt_favorites

es_favorites_info = ls_favorite
s_info ).

ASSERT ls_favorites_info-answer_cachab
le = abap_true.
IF ls_favorites_info-menu_empty EQ aba
p_false.

me->check_on_sap_menu_favorites( EXP
ORTING navigation_tree = lt_favorites ).

ENDIF.

ENDMETHOD. "test_favo
rites

METHOD check_on_sap_menu_favorites.

DATA: entry TYPE if_nwbc_runtime=>t_na


vigation_entry.

LOOP AT navigation_tree INTO entry WHE


RE report_type = if_nwbc_runtime=>e_report
_type-folder

AND
origin_id NE 'PSEUDO_SEARCH'.
ASSERT entry-url CS '~service_map/?s
ap-nwbc-node='

AND entry-is_service_map EQ abap_tru


e.

ENDLOOP.

LOOP AT navigation_tree INTO entry WHE


RE report_type NE if_nwbc_runtime=>e_repor
t_type-folder.

ASSERT entry-url CN '~service_map/?s


ap-nwbc-node='

AND entry-is_service_map EQ abap_f


alse.

ENDLOOP.

LOOP AT navigation_tree INTO entry WHE


RE menu_level = '01'

AND
report_type = if_nwbc_runtime=>e_report
_type-folder

AND
origin_id NE 'PSEUDO_SEARCH'.

ASSERT entry-single_top_level EQ aba


p_true.

ENDLOOP.

LOOP AT navigation_tree INTO entry.

ASSERT entry-object_id IS NOT INITIA


L.

ASSERT entry-parent_id IS NOT INITIA


L.

ASSERT entry-unique_id IS NOT INITIA


L.

ASSERT entry-text IS NOT INITIAL.


ASSERT entry-report_type IS NOT INIT
IAL.

IF entry-origin_id NE 'PSEUDO_SEARCH
'.

ASSERT entry-url IS NOT INITIAL.

ENDIF.

ENDLOOP.

ENDMETHOD. "check_on_
sap_menu_favorites

ENDCLASS. "cl_get_navig
ation_trees_test IMPLEMENTATION
*-----------------------------------------
-----------------------------*

* CLASS cl_enterprise_search_test DE
FINITION

*-----------------------------------------
-----------------------------*

*-----------------------------------------
-----------------------------*

CLASS cl_enterprise_search_test DEFINITION


FOR TESTING FINAL

" DURATION SHORT RISK LEVEL HARMLESS ->


not supported on 700
"#AU Duration Short

"#AU Risk_Level Harmless

PRIVATE SECTION.

METHODS: test_enterprise_search FOR TE


STING.

ENDCLASS. "cl_enterpris
e_search_test DEFINITION

*-----------------------------------------
-----------------------------*

* CLASS cl_enterprise_search_test IM
PLEMENTATION
*-----------------------------------------
-----------------------------*

*-----------------------------------------
-----------------------------*

CLASS cl_enterprise_search_test IMPLEMENTA


TION.

METHOD test_enterprise_search.

DATA: lt_es_entries TYPE if_nwbc_runti


me=>t_search_entries,

es_entry LIKE LINE OF lt_es_entr


ies,

lt_favorites TYPE if_nwbc_runtim


e=>t_navigation_tree,
lt_sap_menu TYPE if_nwbc_runtime
=>t_navigation_tree,

lt_user_menu TYPE if_nwbc_runtim


e=>t_navigation_tree,

entry TYPE if_nwbc_runtime=>t_na


vigation_entry,

entry2 TYPE if_nwbc_runtime=>t_n


avigation_entry,

lo_nwbc_runtime TYPE REF TO if_n


wbc_runtime,

lo_nwbc_runtime35 TYPE REF TO if


_nwbc_runtime35,

lo_cl_nwbc_runtime35 TYPE REF TO


cl_nwbc_runtime35.

lo_nwbc_runtime = cl_nwbc_runtime35=>g
et( nwbc_shell = cl_nwbc=>for_html ).

lo_nwbc_runtime35 ?= lo_nwbc_runtime.
lo_cl_nwbc_runtime35 ?= lo_nwbc_runtim
e.

ASSERT lo_nwbc_runtime IS NOT INITIAL.

" get rid of any buffer

DELETE FROM nwbc_nav_tree.


"#EC CI_NOWHERE

lt_es_entries = lo_cl_nwbc_runtime35->
get_enterprise_search_entries( ).

IF lt_es_entries IS INITIAL.

"no pseudo search folder has to be t


here

READ TABLE lt_favorites TRANSPORTING


NO FIELDS WITH KEY origin_id = 'PSEUDO_SE
ARCH'.

ASSERT sy-subrc NE 0.
READ TABLE lt_sap_menu TRANSPORTING
NO FIELDS WITH KEY origin_id = 'PSEUDO_SEA
RCH'.

ASSERT sy-subrc NE 0.

READ TABLE lt_user_menu TRANSPORTING


NO FIELDS WITH KEY origin_id = 'PSEUDO_SE
ARCH'.

ASSERT sy-subrc NE 0.

ELSE.

lo_nwbc_runtime35->get_navigation_tr
ees( EXPORTING iv_request_favorites = abap
_true

iv_request_sap_menu = abap_
true

iv_request_user_menu = abap
_true
IMPORTING et_favorites = lt_favorites

et_sap_menu = lt_sap_menu

et_user_menu = lt_user_menu
).

* Favorites

"favorites do not have ES entries

READ TABLE lt_favorites TRANSPORTING


NO FIELDS WITH KEY origin_id = 'PSEUDO_SE
ARCH'.

ASSERT sy-subrc NE 0.

"user might have added a @SEARCH@ Fo


lder to its favorites. In this case no ES
entries has

" to be added
READ TABLE lt_favorites INTO entry W
ITH KEY text = cl_nwbc_runtime35=>c_txt_me
nu_search.

IF sy-subrc EQ 0.

LOOP AT lt_es_entries INTO es_entr


y.

READ TABLE lt_favorites TRANSPOR


TING NO FIELDS WITH KEY text = es_entry-di
splay_name

parent_id = entry-
object_id.

ASSERT sy-subrc NE 0.

ENDLOOP.

ENDIF.
* SAP Menu

"sap menu does not have ES entries =


> generated search folder must not be ther
e

READ TABLE lt_sap_menu INTO entry WI


TH KEY origin_id = `PSEUDO_SEARCH`.

ASSERT sy-subrc NE 0.

* User Menu

READ TABLE lt_user_menu INTO entry W


ITH KEY origin_id = `PSEUDO_SEARCH`.

IF sy-subrc NE 0.

READ TABLE lt_user_menu INTO entry


WITH KEY text = cl_nwbc_runtime35=>c_txt_
menu_search.

ASSERT sy-subrc EQ 0.
ENDIF.

"check entries itself

LOOP AT lt_user_menu INTO entry2 WHE


RE parent_id = entry-object_id.

ASSERT entry2-menu_level IS NOT IN


ITIAL.

ASSERT entry2-report_type = if_nwb


c_runtime=>e_report_type-enterprise_search
.

ASSERT entry2-url IS NOT INITIAL."


NWBC might have manipulated it so no check
whether url is the same

READ TABLE lt_es_entries TRANSPORT


ING NO FIELDS WITH KEY display_name = entr
y2-text.

IF entry-origin_id EQ `PSEUDO_SEAR
CH`.
"user has no role with search pr
oviders => no others has to exist

ASSERT sy-subrc EQ 0.

ENDIF.

ENDLOOP.

"vice versa: are all es entries in u


ser menu?

LOOP AT lt_es_entries INTO es_entry.

READ TABLE lt_user_menu TRANSPORTI


NG NO FIELDS WITH KEY parent_id = entry-ob
ject_id

text = es_entry-displ
ay_name.

ASSERT sy-subrc EQ 0.
ENDLOOP.

ENDIF.

ENDMETHOD. "test_ente
rprise_search

ENDCLASS. "cl_enterpris
e_search_test IMPLEMENTATION

LIMU
METH
CL_NWBC_RUNTIME35 CHECK_NAVIGA
TION_TREE_CACHE
00008

LIMU
METH
CL_NWBC_RUNTIME35 CHECK_NAVIGA
TION_TREE_CACHE
00000

3
1
\\\\\no_empty_blocks/////
1
\\\\\comments_not_ignored/////
1
\\\\\delta_normalized/////
1
0
1
9
3
CHECK menu_type NE if_nwbc_constants=>gc
_s_menu_type-favorites.

lv_version = me->if_nwbc_runtime~get_run
time_version( ).

ev_is_nav_tree_cache_valid = abap_true.

2
ev_dont_cache = abap_false.

LIMU
METH
CL_NWBC_RUNTIME35 CHECK_SAP_ME
NU_CACHE
00008

LIMU
METH
CL_NWBC_RUNTIME35 CHECK_SAP_ME
NU_CACHE
00000

3
1
\\\\\no_empty_blocks/////
1
\\\\\comments_not_ignored/////
1
\\\\\delta_normalized/////
1
0
1
8
6
DATA: lt_navigation_tree TYPE IF_NWBC_RU
NTIME35=>T_navigation_tree,

ls_nwbc_nav_tree TYPE nwbc_nav_tre


e,

ls_sap_menu_info TYPE t_sap_menu_i


nfo,

ls_user_info TYPE IF_NWBC_RUNTIME3


5=>T_user_info

* Check SAP Menu

1
ls_sap_menu_info = me->get_sap_menu_info
( ).
2
ev_cache_exist = abap_false.

ls_sap_menu_info = me->get_sap_menu_info
( ).

LIMU
METH
CL_NWBC_RUNTIME35 GET_ENTERPRI
SE_SEARCH_ENTRIES
00008

LIMU
METH
CL_NWBC_RUNTIME35 GET_ENTERPRI
SE_SEARCH_ENTRIES
00000

3
1
\\\\\no_empty_blocks/////
1
\\\\\comments_not_ignored/////
1
\\\\\delta_normalized/////
1
0
3
2
1
method GET_ENTERPRISE_SEARCH_ENTRIES.

1
* IMPORTANT: This code only NW7.02+ and NW
7.20+

2
* IMPORTANT: This code only NW7.02+ and NW
7.20+

67
3
ENDLOOP.

CATCH cx_root INTO exception.


"#EC NO_HANDLER

ENDTRY.

1
* move "All Content" to the front

* move "All Content" to the front


72
3
READ TABLE rt_enterprise_search_entr
ies INTO search_entry INDEX all_content.

DELETE rt_enterprise_search_entries
INDEX all_content.

INSERT search_entry INTO rt_enterpri


se_search_entries INDEX 1.

3
endif.

ENDIF.

14
ENDIF.
" based on last request from ES colleg
es, they do nto want to see different ES c
ategories in the NWBC

" but want to have only one entry, cor


responding to ALL_CONTENT category

" but we do not know, if they will not


decide to change their mind soon, so we g
o defensive approach

" and leave the logic for category col


lection in place, but only leave one singl
e category in the list

" if exist. In most cases it will be A


LL_CONTENT category

READ TABLE rt_enterprise_search_entrie


s INDEX 1 INTO search_entry.

IF sy-subrc IS INITIAL.

CLEAR rt_enterprise_search_entries.

APPEND search_entry TO rt_enterprise


_search_entries.
ENDIF.

ENDIF.

LIMU
METH
CL_NWBC_RUNTIME35 IF_NWBC_RUNT
IME35~GET_ASSOCIATED_APPS
00004

LIMU
METH
CL_NWBC_RUNTIME35 IF_NWBC_RUNT
IME35~GET_ASSOCIATED_APPS
00000

3
1
\\\\\no_empty_blocks/////
1
\\\\\comments_not_ignored/////
1
\\\\\delta_normalized/////
1
0
1
55
6
DELETE ADJACENT DUPLICATES FROM lt_sps.
" OK, there are no duplicated SPs, but e
ven if they different, clients are not abl
e to display

" SPs with same texts, so we need to als


o delete side panels based on text equity

lt_nav_tree_srt = lt_nav_tree.

1
LOOP AT lt_nav_tree ASSIGNING <entry>.

1
LOOP AT lt_nav_tree_srt ASSIGNING <entry
>.

LIMU
METH
CL_NWBC_RUNTIME35 IF_NWBC_RUNT
IME35~GET_ASSOCIATED_LINKS
00004

LIMU
METH
CL_NWBC_RUNTIME35 IF_NWBC_RUNT
IME35~GET_ASSOCIATED_LINKS
00000

3
1
\\\\\no_empty_blocks/////
1
\\\\\comments_not_ignored/////
1
\\\\\delta_normalized/////
1
0
2
7
4
DATA: lt_nav_tree TYPE if_nwbc_run
time=>t_navigation_tree,

lt_nav_tree_srt TYPE if_nwbc_run


time=>t_navigation_tree_srt,

lt_tree_nodes TYPE if_nwbc_run


time=>t_navigation_tree,

lt_nodes LIKE et_node_ids


,

2
lt_texts TYPE string_tabl
e,

lt_links LIKE et_node_ids


,
1
lt_links LIKE et_node_ids
,

55
6
DELETE ADJACENT DUPLICATES FROM lt_links
.

" OK, there are no duplicated SPs, but e


ven if they different, clients are not abl
e to display

" SPs with same texts, so we need to als


o delete side panels based on text equity

lt_nav_tree_srt = lt_nav_tree.

1
LOOP AT lt_nav_tree ASSIGNING <entry>.
1
LOOP AT lt_nav_tree_srt ASSIGNING <entry
>.

LIMU
METH
CL_NWBC_RUNTIME35 IF_NWBC_RUNT
IME35~GET_ASSOCIATED_SEARCHES
00004

LIMU
METH
CL_NWBC_RUNTIME35 IF_NWBC_RUNT
IME35~GET_ASSOCIATED_SEARCHES
00000

3
1
\\\\\no_empty_blocks/////
1
\\\\\comments_not_ignored/////
1
\\\\\delta_normalized/////
1
0
1
62
6
DELETE ADJACENT DUPLICATES FROM lt_searc
hes.

" OK, there are no duplicated SPs, but e


ven if they different, clients are not abl
e to display

" SPs with same texts, so we need to als


o delete side panels based on text equity
lt_nav_tree_srt = lt_nav_tree.

1
LOOP AT lt_nav_tree ASSIGNING <entry>.

1
LOOP AT lt_nav_tree_srt ASSIGNING <entry
>.

LIMU
METH
CL_NWBC_RUNTIME35 IF_NWBC_RUNT
IME35~INVALIDATE_NAV_TREE_CACHE
00008

LIMU
METH
CL_NWBC_RUNTIME35 IF_NWBC_RUNT
IME35~INVALIDATE_NAV_TREE_CACHE
00000

3
1
\\\\\no_empty_blocks/////
1
\\\\\comments_not_ignored/////
1
\\\\\delta_normalized/////
1
0
2
2
1
METHOD if_nwbc_runtime35~invalidate_nav_tr
ee_cache.

1
DELETE FROM DATABASE nwbc_nav_tree(nt) I
D me->cache_id."Navigation Tree Data

DATA: lv_cache_counter TYPE i,

lv_cache_counter_string TYPE strin


g.

IF iv_all_users EQ abap_true.

DELETE FROM nwbc_nav_tree.


"#EC CI_NOWHERE
IMPORT cache_counter = lv_cache_counte
r_string FROM DATABASE indx(^c) ID c_nwbc_
cache_counter_id.

ELSE.

DELETE FROM DATABASE nwbc_nav_tree(nt)


ID me->cache_id."Navigation Tree Data

7
3
DELETE FROM DATABASE nwbc_nav_tree(ob) I
D me->cache_id."OBN Data

DELETE FROM DATABASE nwbc_nav_tree(bo) I


D me->cache_id."OBN Raw data (agr_hier_bor
)

DELETE FROM DATABASE nwbc_nav_tree(sc) I


D me->cache_id."Session Cache

5
CLEAR: me->cached_navigation_tree.

CLEAR: me->cached_obn_targets.
CLEAR: me->cached_user_menu.

cl_nwbc_logger=>add_message( runtime = m
e no = 031 v1 = me->cache_id-extended_key
).

22
IMPORT cache_counter = lv_cache_counte
r_string FROM DATABASE indx(^c) ID me->cac
he_id.

ENDIF.

CLEAR: me->cached_navigation_tree.

CLEAR: me->cached_obn_targets.

CLEAR: me->cached_user_menu.
lv_cache_counter = lv_cache_counter_stri
ng.

ADD 1 TO lv_cache_counter.

lv_cache_counter_string = lv_cache_count
er.

CONDENSE lv_cache_counter_string.

" record cache invalidation, to update o


ur role keys later

IF iv_all_users EQ abap_true.
EXPORT cache_counter = lv_cache_counte
r_string TO DATABASE indx(^c) ID c_nwbc_ca
che_counter_id.

ELSE.

EXPORT cache_counter = lv_cache_counte


r_string TO DATABASE indx(^c) ID me->cache
_id.

ENDIF.

IF iv_log EQ abap_true.

cl_nwbc_logger=>add_message( runtime =
me no = 031 v1 = me->cache_id-extended_ke
y ).

ENDIF.

LIMU
METH
CL_NWBC_RUNTIME35 IF_NWBC_RUNT
IME~EPCM_DO_NAVIGATE
00019

LIMU
METH
CL_NWBC_RUNTIME35 IF_NWBC_RUNT
IME~EPCM_DO_NAVIGATE
00000

3
1
\\\\\no_empty_blocks/////
1
\\\\\comments_not_ignored/////
1
\\\\\delta_normalized/////
1
0
2
4
3
METHOD if_nwbc_runtime~epcm_do_navigate.

CONSTANTS: lc_is_suspend_scenario TYPE s


tring VALUE `sap-nwbc-is_suspend_scenario`
, "#EC NOTEXT

3
lc_force_local_system TYPE s
tring VALUE `sap-nwbc-force_local_system`,
"#EC NOTEXT

lc_crystal_report TYPE s
tring VALUE `CrystalReport`, "#EC NOTEXT
lc_hook_url TYPE s
tring VALUE `HOOK_URL`, "#EC NOTEXT

1
lc_hook_url TYPE s
tring VALUE `HOOK_URL`, "#EC NOTEXT

32
3
query TYPE string,

lv_subrc TYPE sysubrc


.

2
FIELD-SYMBOLS: <ff> LIKE LINE OF post_b
ody,

<ff2> LIKE LINE OF post_b


ody.

1
FIELD-SYMBOLS: <ff> LIKE LINE OF post_b
ody.
LIMU
METH
CL_NWBC_RUNTIME35 IF_NWBC_RUNT
IME~GET_USER_INFO
00014

LIMU
METH
CL_NWBC_RUNTIME35 IF_NWBC_RUNT
IME~GET_USER_INFO
00000

3
1
\\\\\no_empty_blocks/////
1
\\\\\comments_ignored/////
1
\\\\\delta_normalized/////
1
0
8
187
3
theme = server->request->get_form_fi
eld( if_http_form_fields_sap=>sap_theme ).

IF theme IS NOT INITIAL.

" check that theme name is valid

1
IF theme CA `#^&?%"'<>=+`. "#E
C NOTEXT

1
IF theme CA `#^&?%"'<>=+`. "#E
C STRING_OK

209
5
DATA: roles TYPE if_nwbc_runtime3
5=>t_roles,

ts LIKE me->cached_user_
info-roles_timestamp,

role_list TYPE string,

role_hash TYPE hash160.

1
FIELD-SYMBOLS: <role> LIKE LINE OF rol
es.

4
DATA: lv_global_cache_counter_string T
YPE string,

lv_my_cache_counter_string T
YPE string.

FIELD-SYMBOLS: <role> LIKE LINE OF rol


es.

214
4

" unfortunaelly we need to store sessi


on context, for which we have generated ou
r keys,

" to be able to update our cache, in c


ase of sesion context is changed (initiali
zed)

me->cached_user_info-session_context =
ls_context-default_context.

roles = me->if_nwbc_runtime~get_roles(
).
5

IMPORT cache_counter = lv_global_cache


_counter_string FROM DATABASE indx(^c) ID
c_nwbc_cache_counter_id.

IMPORT cache_counter = lv_my_cache_cou


nter_string FROM DATABASE indx(^c) ID me->
cache_id.

roles = me->if_nwbc_runtime~get_roles(
).

242
7
CONCATENATE `r-` sy-saprl

`--u-` sy-uname

`--rh- ` role_hash
`--l-` me->cached_user_
info-language

`--a-` me->cached_user_
info-accessibility

`--tn-` me->cached_user_
info-show_transaction_codes

`--cd-` cache_discrimina
tor

1
`--rtl-` me->runtime_load

3
`--gcd-` lv_global_cache_
counter_string

`--mcd-` lv_my_cache_coun
ter_string

`--rtl-` me->runtime_load
252
6
CONDENSE me->cached_user_info-roles_ke
y NO-GAPS.

"Favorites ***************************
******************************************
*****

"timestamp

DATA: lv_fav_change_date TYPE dats,

2
lv_fav_change_time TYPE tims,

lv_version TYPE string.


1
lv_fav_change_time TYPE tims.

266
3
IF sy-subrc EQ 0.

CONVERT DATE lv_fav_change_date TIME


lv_fav_change_time INTO TIME STAMP me->ca
ched_user_info-favorites_timestamp TIME ZO
NE sy-zonlo.

ENDIF.

lv_version = me->if_nwbc_runtime~get_r
untime_version( ).

"favorites key
2

"favorites key

276
6
CONCATENATE `r-` sy-saprl

`--u-` sy-uname

`--l-` me->cached_user_
info-language

`--a-` me->cached_user_
info-accessibility

`--tn-` me->cached_user_
info-show_transaction_codes

`--cd-` cache_discrimina
tor
1
`--rtl-` me->runtime_load

3
`--gcd-` lv_global_cache_
counter_string

`--mcd-` lv_my_cache_coun
ter_string

`--rtl-` me->runtime_load

302
6
CONCATENATE `r-` sy-saprl

`--rh- ` me->cached_user_
info-sap_menu_name

`--l-` me->cached_user_
info-language

`--a-` me->cached_user_
info-accessibility
`--tn-` me->cached_user_
info-show_transaction_codes

`--cd-` cache_discrimina
tor

1
`--rtl-` me->runtime_load

3
`--gcd-` lv_global_cache_
counter_string

`--mcd-` lv_my_cache_coun
ter_string

`--rtl-` me->runtime_load

LIMU
METH
CL_NWBC_RUNTIME35 IF_NWBC_RUNT
IME~HANDLE_API
00012

LIMU
METH
CL_NWBC_RUNTIME35 IF_NWBC_RUNT
IME~HANDLE_API
00000
3
1
\\\\\no_empty_blocks/////
1
\\\\\comments_not_ignored/////
1
\\\\\delta_normalized/////
1
0
3
147
3
ELSE.

lv_version = io_server_assist->get
_filtered_form_field( name = 'nwbc_runtime
_version' accept = '0-9.' ). "#EC NOTEXT

lv_sb = io_server_assist->get
_filtered_form_field( name = 'sap-nwbc-sup
portbits' accept = '0-9A-F' ). "#EC NOTEXT

1
cl_nwbc=>initialize_client( versio
n = lv_version support_bits = lv_sb ).

1
cl_nwbc=>initialize_client( vers
ion = lv_version support_bits = lv_sb nwbc
_shell = nwbc_shell ).

201
3

lv_version = io_server_assist->get_f
iltered_form_field( name = 'nwbc_runtime_v
ersion' accept = '0-9.' ). "#EC NOTEXT

lv_sb = io_server_assist->get_f
iltered_form_field( name = 'sap-nwbc-suppo
rtbits' accept = '0-9A-F' ). "#EC NOTEXT

3
cl_nwbc=>initialize_client( EXPORTIN
G version = lv_version support_bits = lv_s
b EXCEPTIONS already_initialized = 1 ).

CLEAR cached_user_info.

IF sy-subrc IS NOT INITIAL. ENDIF.


"#EC NEEDED

2
cl_nwbc=>initialize_client( EXPORT
ING version = lv_version support_bits = lv
_sb nwbc_shell = nwbc_shell ).

CLEAR cached_user_info.

442
5
io_server_assist->set_response(

iv_content = xml
iv_content_type = if_nwbc_constant
s=>gc_s_file_type-xml ).

WHEN 'INVALIDATE_NAVIGATION_TREE_BUFFE
R' OR 'INVALIDATENAVIGATIONTREEBUFFER'.

1
if_nwbc_runtime35~invalidate_nav_tre
e_cache( ).

1
if_nwbc_runtime35~invalidate_nav_t
ree_cache( iv_log = abap_false ).

LIMU
METH
CL_NWBC_RUNTIME35 IF_NWBC_RUNT
IME~RESOLVE_NAVIGATION
00010

LIMU
METH
CL_NWBC_RUNTIME35 IF_NWBC_RUNT
IME~RESOLVE_NAVIGATION
00000

3
1
\\\\\no_empty_blocks/////
1
\\\\\comments_not_ignored/////
1
\\\\\delta_normalized/////
1
0
1
395
3
DATA: ls_navigation_entry LIKE navigat
ion_entry.

ls_navigation_entry = navigation_entry
.

ls_navigation_entry-target_system = sm
59_alias.

1
cl_nwbc=>read_query_parameter( EXPORTI
NG iv_name = 'orig_url' CHANGING cv_url =
url rv_value = ls_navigation_entry-url ).

1
cl_nwbc=>read_query_parameter( EXPORTI
NG iv_name = 'orig_url' CHANGING cv_url =
url rv_value = ls_navigation_entry-url ).
"#EC NOTEXT

LIMU
METH
CL_NWBC_RUNTIME35 RESOLVE_LPD_
CRE
00002

LIMU
METH
CL_NWBC_RUNTIME35 RESOLVE_LPD_
CRE
00000

3
1
\\\\\no_empty_blocks/////
1
\\\\\comments_not_ignored/////
1
\\\\\delta_normalized/////
1
0
2
3
2
METHOD resolve_lpd_cre.

2
CONSTANTS: lc_force_local_system TYPE
string VALUE `sap-nwbc-force_local_system
`,

lc_crystal_report TYPE
string VALUE `CrystalReport`.

2
CONSTANTS: lc_force_local_system TYPE
string VALUE `sap-nwbc-force_local_system
`, "#EC NOTEXT

lc_crystal_report TYPE
string VALUE `CrystalReport`. "#EC NOTEXT

76
3
ENDIF.

" Crystal Reports do now like sap-clie


nt they WANT sap_client! CSN 2334674 2011

1
REPLACE ALL OCCURRENCES OF if_http_for
m_fields_sap=>sap_client IN ev_url WITH `s
ap_client`.

1
REPLACE ALL OCCURRENCES OF if_http_for
m_fields_sap=>sap_client IN ev_url WITH `s
ap_client`. "#EC NOTEXT

LIMU
METH
CL_NWBC_RUNTIME35 RESOLVE_URL

00008

LIMU
METH
CL_NWBC_RUNTIME35 RESOLVE_URL

00000

3
1
\\\\\no_empty_blocks/////
1
\\\\\comments_not_ignored/////
1
\\\\\delta_normalized/////
1
0
5
13
6
DATA: lv_length TYPE i,

lv_query TYPE string,

lv_params TYPE string,

lv_obn_system TYPE string,

lv_obn_object TYPE string,

lv_obn_operation TYPE string,

1
lt_fields LIKE query_parms
,

2
lo_lsapi TYPE REF TO if_l
sapi,
lt_fields LIKE query_parms
,

18
4
in_parms LIKE query_parms
.

FIELD-SYMBOLS: <ff> LIKE LINE OF query


_parms.

1
IF target CS `OBN://` AND sy-fdpos EQ 0.

3
lo_lsapi = cl_lsapi_manager=>get_instanc
e( ).
IF target CS `OBN://` AND sy-fdpos EQ 0.

155
4
ELSEIF target CS if_lsapi=>gc_s_protocol
-transaction AND sy-fdpos EQ 0.

* Example

* ls-tr://YI3100~SE80?USR02-BNAME=XYZ

3
DATA: lv_sm59_alias TYPE string,

lv_dynp_okcode TYPE string,

lv_transaction TYPE string.


5
DATA: lv_sm59_alias TYPE rfcdest,

lv_dynp_okcode TYPE string,

lv_native_sapgui TYPE abap_bool


,

lv_force_sapgui TYPE string,

lv_transaction TYPE tcode.

172
3
IF lv_transaction IS INITIAL.

RAISE not_resolved.

ENDIF.
3

report_type = if_nwbc_runtime~e_report
_type-transaction.

13

lv_native_sapgui = lo_lsapi->is_suppor
ted( feature = if_lsapi=>mc_feature_nwbc_n
ative_sapgui ).

cl_nwbc=>read_query_parameter( EXPORTI
NG iv_name = if_lsapi=>mc_tr_force_sapgui
iv_delete = abap_true

CHANGIN
G cv_get = lv_params ct_post = query_par
ms rv_value = lv_force_sapgui ).
IF lv_force_sapgui EQ abap_true AND lv
_native_sapgui EQ abap_false.

report_type = if_nwbc_runtime~e_repo
rt_type-url.

cl_nwbc_utility=>string_to_fields( E
XPORTING iv_string = lv_params IMPORTING e
t_fields = lt_fields ).

APPEND LINES OF query_parms TO lt_fi


elds.

url = cl_nwbc_sapgui_shortcut=>url(
iv_transaction_code = lv_transaction iv_sm
59_destination = lv_sm59_alias it_paramete
rs = lt_fields ).

ELSE.

report_type = if_nwbc_runtime~e_repo
rt_type-transaction.

179
4
cl_nwbc=>read_query_parameter( EXPORTI
NG iv_name = cl_url=>mc_its_dynp_okcode iv
_delete = abap_true

CHANGIN
G cv_get = lv_params ct_post = query_par
ms rv_value = lv_dynp_okcode ).

url = me->url->its( sm59_alias = lv_sm


59_alias transaction = lv_transaction dynp
_okcode = lv_dynp_okcode query_parms = que
ry_parms query_string = lv_params ).

3
CLEAR query_parms. " no post body for
transactions

ELSEIF target CS `mailto:` AND sy-fdpos


EQ 0.

4
ENDIF.

CLEAR query_parms. " no post body for


transactions
ELSEIF target CS `mailto:` AND sy-fdpos
EQ 0. "#EC NOTEXT

LIMU
METH
CL_NWBC_RUNTIME35 TREE_PROCESS
_APPL_ALIAS_GLOBAL
00008

LIMU
METH
CL_NWBC_RUNTIME35 TREE_PROCESS
_APPL_ALIAS_GLOBAL
00000

3
1
\\\\\no_empty_blocks/////
1
\\\\\comments_not_ignored/////
1
\\\\\delta_normalized/////
1
0
1
15
3
DATA: lv_name TYPE str
ing,

lv_clone_id TYPE s
tring,

lv_object_id TYPE s
tring,

2
lt_result_tab TYPE mat
ch_result_tab,

lt_transactions_refs TYPE tt_


references,

1
lt_transactions_refs TYPE tt_
references,

0120031469
15108
0001233342
0001
0
0120031469
15108
0001233230
0002
47
LIMU
CINC
CL_LSAPI_MANAGER==============CCIMP

00004

LIMU
CINC
CL_LSAPI_MANAGER==============CCIMP

00000

36
1
\\\\\no_empty_blocks/////
1
\\\\\comments_not_ignored/////
1
\\\\\delta_normalized/////
3
\\\\\allowed/////
FORM
*
3
\\\\\allowed/////
FUNCTION
*
3
\\\\\allowed/////
MODULE
**
3
\\\\\allowed/////
REPORT
*
3
\\\\\allowed/////
PROGRAM
*
3
\\\\\allowed/////
FUNCTION-POOL
*
4
\\\\\allowed/////
CLASS
*
DEFINITION
4
\\\\\allowed/////
CLASS
*
IMPLEMENTATION
5
\\\\\forbidden/////
CLASS
*
DEFINITION
DEFERRED
5
\\\\\forbidden/////
CLASS
*
DEFINITION
LOAD
6
\\\\\forbidden/////
CLASS
*
DEFINITION
LOCAL
FRIENDS
3
\\\\\allowed/////
AT
LINE-SELECTION
3
\\\\\allowed/////
AT
USER-COMMAND
4
\\\\\allowed/////
AT
SELECTION-SCREEN
**
3
\\\\\allowed/////
AT
PF*
2
\\\\\allowed/////
INITIALIZATION
2
\\\\\allowed/////
START-OF-SELECTION
2
\\\\\allowed/////
END-OF-SELECTION
3
\\\\\allowed/////
TOP-OF-PAGE
**
2
\\\\\allowed/////
END-OF-PAGE
3
\\\\\allowed/////
GET
**
3
\\\\\forbidden/////
GET
BADI
3
\\\\\forbidden/////
GET
BIT
3
\\\\\forbidden/////
GET
CONNECTION
3
\\\\\forbidden/////
GET
CURSOR
3
\\\\\forbidden/////
GET
DATASET
3
\\\\\forbidden/////
GET
LOCALE
3
\\\\\forbidden/////
GET
PARAMETER
3
\\\\\forbidden/////
GET
PF-STATUS
3
\\\\\forbidden/////
GET
PROPERTY
3
\\\\\forbidden/////
GET
REFERENCE
3
\\\\\forbidden/////
GET
RUN
3
\\\\\forbidden/////
GET
TIME
2
3
CLASS
LC_LSAPI_SAPGUI_STANDALONE
IMPLEMENTATION
3
29
3
lv_window_title = title.

lv_window_features = window_attributes
.

1
MOVE mode TO lv_navigation_mode.

5
" in SAP GUI standalone case we need t
o ignore sap-force_sapgui flag
cl_nwbc=>read_query_parameter( EXPORTI
NG iv_name = if_lsapi=>mc_tr_force_sapgui
iv_delete = abap_true

CHANGIN
G cv_url = lv_location ct_post = lt_fiel
ds ).

MOVE mode TO lv_navigation_mode.

57
3
lv_tr_name = lv_tr.

LOOP AT lt_fields ASSIGNING <param>.

1
ls_gui_param-parid = <param>-nam
e.
2
CHECK <param>-name NE if_lsapi=>mc
_tr_force_sapgui.

ls_gui_param-parid = <param>-nam
e.

84
7
CALL FUNCTION 'ABAP4_CALL_TRANSACT
ION' STARTING NEW TASK 'TEST'

EXPORTING

tcode = lv_t
r_name

skip_screen = lv_s
kip_sel_screen

TABLES

spagpa_tab = lt_g
ui_param
EXCEPTIONS

3
call_transaction_denied = 1

tcode_invalid = 2

OTHERS = 3.

1
OTHERS.

3
CLASS
LC_LSAPI_SAPGUI_NWBC
IMPLEMENTATION
2
92
4
ENDMETHOD. "is_lscont
ext_supported
METHOD constructor.

3
DATA: clsid(80),

event_tab TYPE cntl_simp


le_events,

event_tab_line TYPE cntl_simp


le_event.

1
DATA: clsid(80).

144
3
lv_context_string = me->get_context(
).

cl_nwbc=>context_set_from_http_reque
st( context_string = lv_context_string ).
ELSE.

1
cl_nwbc=>initialize_client( version
= 'SAP GUI 7.20' sb_nwbc_navigate = abap_t
rue ).

1
cl_nwbc=>initialize_client( version
= 'SAP GUI 7.20' sb_nwbc_navigate = abap_t
rue nwbc_shell = cl_nwbc=>for_desktop ).

LIMU
CINC
CL_NWBC_HTTP==================CCIMP

00002

LIMU
CINC
CL_NWBC_HTTP==================CCIMP

00000

31
1
\\\\\no_empty_blocks/////
1
\\\\\comments_ignored/////
1
\\\\\delta_normalized/////
3
\\\\\allowed/////
FORM
*
3
\\\\\allowed/////
FUNCTION
*
3
\\\\\allowed/////
MODULE
**
3
\\\\\allowed/////
REPORT
*
3
\\\\\allowed/////
PROGRAM
*
3
\\\\\allowed/////
FUNCTION-POOL
*
3
\\\\\allowed/////
AT
LINE-SELECTION
3
\\\\\allowed/////
AT
USER-COMMAND
4
\\\\\allowed/////
AT
SELECTION-SCREEN
**
3
\\\\\allowed/////
AT
PF*
2
\\\\\allowed/////
INITIALIZATION
2
\\\\\allowed/////
START-OF-SELECTION
2
\\\\\allowed/////
END-OF-SELECTION
3
\\\\\allowed/////
TOP-OF-PAGE
**
2
\\\\\allowed/////
END-OF-PAGE
3
\\\\\allowed/////
GET
**
3
\\\\\forbidden/////
GET
BADI
3
\\\\\forbidden/////
GET
BIT
3
\\\\\forbidden/////
GET
CONNECTION
3
\\\\\forbidden/////
GET
CURSOR
3
\\\\\forbidden/////
GET
DATASET
3
\\\\\forbidden/////
GET
LOCALE
3
\\\\\forbidden/////
GET
PARAMETER
3
\\\\\forbidden/////
GET
PF-STATUS
3
\\\\\forbidden/////
GET
PROPERTY
3
\\\\\forbidden/////
GET
REFERENCE
3
\\\\\forbidden/////
GET
RUN
3
\\\\\forbidden/////
GET
TIME
1
0
4
2
1

6
*-----------------------------------------
-----------------------------*

* CLASS lcl_http_base_handler DEFINI


TION
*-----------------------------------------
-----------------------------*

*-----------------------------------------
-----------------------------*

CLASS lcl_http_base_handler DEFINITION ABS


TRACT.

289
**----------------------------------------
------------------------------*

** CLASS lcl_http DEFINITION

**----------------------------------------
------------------------------*

*CLASS lcl_http DEFINITION.


* PUBLIC SECTION.

* METHODS:

* constructor IMPORTING server TYPE R


EF TO if_http_server,

* html IMPORTING data TYPE string,

* xml IMPORTING data TYPE xstring

* cdata TYPE csequence


OPTIONAL

* type TYPE st
ring DEFAULT 'text/xml' "#EC NOTEXT

* value(charset) TYPE
csequence OPTIONAL

* PREFERRED PARAMETER
data,
* ff IMPORTING name TYPE string

* accept TYPE string


OPTIONAL

* reject TYPE string


OPTIONAL

* upper TYPE abap_bo


ol DEFAULT abap_false

* default TYPE string


OPTIONAL

* RETURNING VALUE(ff) TYPE strin


g,

* ffs IMPORTING name TYPE string


OPTIONAL

* accept TYPE string


OPTIONAL

* reject TYPE string


OPTIONAL

* upper TYPE abap_bo


ol DEFAULT abap_false

* only_post_body TYPE
abap_bool DEFAULT abap_false

* RETURNING VALUE(ffs) TYPE tiht


tpnvp.

* DATA:

* server TYPE REF TO if_http_server


,

* request TYPE REF TO if_http_reques


t,

* response TYPE REF TO if_http_respon


se.

*ENDCLASS. "lcl_http DE
FINITION
*

**----------------------------------------
------------------------------*

** CLASS lcl_http IMPLEMENTATION

**----------------------------------------
------------------------------*

*CLASS lcl_http IMPLEMENTATION.

*
* METHOD constructor.

* me->server = server.

* me->request = server->request.

* me->response = server->response.

* ENDMETHOD. "construc
tor

* METHOD html.

* server->set_compression( EXCEPTIONS O
THERS = 99 ).
* server->response->set_status( code =
200 reason = `OK` ).
"#EC NOTEXT

* server->response->set_header_field( n
ame = if_http_header_fields=>cache_contro
l value = 'no-store, no-cache, must-revali
date' ). "#EC NOTEXT

* server->response->set_header_field( n
ame = if_http_header_fields=>pragma value
= 'no-cache' ).
"#EC NOTEXT

* server->response->set_header_field( n
ame = if_http_header_fields=>expires valu
e = '0' ).

* server->response->set_header_field( n
ame = if_http_header_fields=>content_type
value = `text/html` ).
"#EC NOTEXT

* server->response->set_cdata( data ).

* ENDMETHOD. "html

* METHOD xml.
* DATA : content_type TYPE string.

* content_type = type.

* server->set_compression( EXCEPTIONS O
THERS = 99 ).

* server->response->set_status( code =
200 reason = `OK` ).
"#EC NOTEXT

* server->response->set_header_field( n
ame = if_http_header_fields=>cache_contro
l value = 'no-store, no-cache, must-revali
date' ). "#EC NOTEXT

* server->response->set_header_field( n
ame = if_http_header_fields=>pragma value
= 'no-cache' ).
"#EC NOTEXT

* server->response->set_header_field( n
ame = if_http_header_fields=>expires valu
e = '0' ).

* IF data IS SUPPLIED.
* CONCATENATE content_type `; charset
=utf-8` INTO content_type. "#EC NOTEXT

* server->response->set_header_field(
name = if_http_header_fields=>content_ty
pe value = content_type ). "#EC NOTEXT

* server->response->set_data( data ).

* ELSE.

* DATA: default_charset(255) TYPE c.

* IF charset IS SUPPLIED AND charset


= sy-langu.

* CALL FUNCTION 'SCP_CODEPAGE_INFO'

* IMPORTING

* http_name = default_charset.
* CONCATENATE content_type `; chars
et=` default_charset INTO content_type. "#
EC NOTEXT

* ELSEIF charset IS SUPPLIED.

* CONCATENATE content_type `; chars


et=` charset INTO content_type. "#EC NOTEX
T

* ELSE.

* CONCATENATE content_type `; chars


et=utf-8` INTO content_type. "#EC NOTEXT

* ENDIF.

* server->response->set_header_field(
name = if_http_header_fields=>content_ty
pe value = content_type ).

* server->response->set_cdata( cdata
).

* ENDIF.
* ENDMETHOD. "xml

* METHOD ff.

*" query = http->ff( name = 'query' acce


pt = 'A-Z0-9*/' ).

* ff = server->request->get_form_field(
name = name ).

* IF upper IS SUPPLIED AND upper = abap


_true.

* TRANSLATE ff TO UPPER CASE. "#EC SY


NTCHAR

* ENDIF.
* IF accept IS SUPPLIED AND accept IS
NOT INITIAL.

* DATA: characters TYPE string.

* characters = accept.

* REPLACE '0-9' IN characters WITH '


0123456789'.

* REPLACE 'a-z' IN characters WITH '


abcdefghijklmnopqrstuvwxyz'. "#EC NOTEXT

* REPLACE 'A-Z' IN characters WITH '


ABCDEFGHIJKLMNOPQRSTUVWXYZ'. "#EC NOTEXT

* IF ff CN characters. " contains NOT


only

* CLEAR ff.

* ENDIF.
* ENDIF.

* IF reject IS SUPPLIED AND reject IS


NOT INITIAL.

* characters = reject.

* REPLACE '0-9' IN characters WITH '


0123456789'.

* REPLACE 'a-z' IN characters WITH '


abcdefghijklmnopqrstuvwxyz'. "#EC NOTEXT

* REPLACE 'A-Z' IN characters WITH '


ABCDEFGHIJKLMNOPQRSTUVWXYZ'. "#EC NOTEXT

* IF ff CA characters. " contains any

* CLEAR ff.
* ENDIF.

* ENDIF.

* IF default IS SUPPLIED AND ff IS INIT


IAL.

* ff = default.

* ENDIF.

* ENDMETHOD. "ff

* METHOD ffs.

*
* FIELD-SYMBOLS: <ff> LIKE LINE OF ffs.

* IF only_post_body = abap_false.

* server->request->get_form_fields( C
HANGING fields = ffs ).

* ELSE.

* DATA: body TYPE string.

* body = server->request->get_cdata(
).

* ffs = cl_http_utility=>string_to_fi
elds( string = body ).
* ENDIF.

* IF name IS SUPPLIED.

* LOOP AT ffs ASSIGNING <ff>.

* IF <ff>-name NS name OR strlen( <


ff>-name ) <> strlen( name ).

* DELETE ffs.

* ENDIF.

* ENDLOOP.

* ENDIF.
*

* IF upper IS SUPPLIED AND upper = abap


_true.

* LOOP AT ffs ASSIGNING <ff>.

* TRANSLATE <ff>-value TO UPPER CAS


E. "#EC SYNTCHAR

* ENDLOOP.

* ENDIF.

* IF accept IS SUPPLIED AND accept IS


NOT INITIAL.

* DATA: characters TYPE string.


* characters = accept.

* REPLACE '0-9' IN characters WITH '


0123456789'.

* REPLACE 'a-z' IN characters WITH '


abcdefghijklmnopqrstuvwxyz'.

* REPLACE 'A-Z' IN characters WITH '


ABCDEFGHIJKLMNOPQRSTUVWXYZ'.

* LOOP AT ffs ASSIGNING <ff>.

* IF <ff>-value CN characters. " co


ntains NOT only

* DELETE ffs.

* ENDIF.
* ENDLOOP.

* ENDIF.

* IF reject IS SUPPLIED AND reject IS


NOT INITIAL.

* characters = reject.

* REPLACE '0-9' IN characters WITH '


0123456789'.

* REPLACE 'a-z' IN characters WITH '


abcdefghijklmnopqrstuvwxyz'.

* REPLACE 'A-Z' IN characters WITH '


ABCDEFGHIJKLMNOPQRSTUVWXYZ'.

* LOOP AT ffs ASSIGNING <ff>.

* IF <ff>-value CA characters. " co


ntains any
* DELETE ffs.

* ENDIF.

* ENDLOOP.

* ENDIF.

* ENDMETHOD. "ffs

*ENDCLASS. "lcl_http IM
PLEMENTATION
*

**----------------------------------------
------------------------------*

** CLASS lcl_html DEFINITION

**

** What this class does, is takes a sequen


ce of HTML in this format below
** and converts to final HTML.

**

** ` <html>`

** `[LINE] <body onload="{handler}">`

**

** In this sequence, [token] must start in


position 1 and marks any

** sequence of lines of been "repeatable".


Everytime that this line

** is token replaced, it is repeated. Actu


al tokens are in {token} format.
**----------------------------------------
------------------------------*

*CLASS lcl_html DEFINITION INHERITING FROM


lcl_http.

* PUBLIC SECTION.

* METHODS:

* clear,

* src IMPORTING VALUE(code) T


YPE string,

* render,

* token_all IMPORTING token TYPE st


ring value TYPE string,

* token_one IMPORTING line TYPE str


ing token TYPE string value TYPE string,
* token_nvp IMPORTING line TYPE str
ing nvp TYPE ihttpnvp.

* CONSTANTS:

* crlf TYPE string VALUE cl_ab


ap_char_utilities=>cr_lf.

* PRIVATE SECTION.

* DATA:

* tbl TYPE tihttpnvp,

* indent TYPE i VALUE 0.

*ENDCLASS.

*
*

**----------------------------------------
------------------------------*

** CLASS lcl_http IMPLEMENTATION

**----------------------------------------
------------------------------*

*CLASS lcl_html IMPLEMENTATION.

* METHOD clear.
* CLEAR: tbl, indent.

* ENDMETHOD.

* METHOD src.

* IF tbl IS INITIAL.

* WHILE code(1) = ` `.

* indent = indent + 1.

* code = code+1.

* ENDWHILE.
* DO indent TIMES.

* CONCATENATE ` ` code INTO code.

* ENDDO.

* ENDIF.

* DATA: line LIKE LINE OF tbl.

* line-value = code.

* line-name = line-value(indent).

* CONCATENATE crlf line-value+indent IN


TO line-value.
* CONDENSE line-name NO-GAPS.

* IF line-name IS NOT INITIAL AND lines


( tbl ) IS NOT INITIAL.

* FIELD-SYMBOLS: <line> LIKE LINE OF


tbl.

* DATA: last_line TYPE i. last_line =


lines( tbl ).

* READ TABLE tbl INDEX last_line ASSI


GNING <line>.

* IF <line>-name = line-name.

* CONCATENATE <line>-value line-val


ue INTO <line>-value.

* RETURN. " <-- RETURN

* ENDIF.
* ENDIF.

* APPEND line TO tbl.

* ENDMETHOD.

* METHOD render.

* DATA: html TYPE string.

* FIELD-SYMBOLS: <line> LIKE LINE OF tb


l.

* LOOP AT tbl ASSIGNING <line> WHERE na


me IS INITIAL.
* CONCATENATE html <line>-value INTO
html.

* ENDLOOP.

* html = html+2. " get rid of leading c


rlf

* me->html( html ).

* ENDMETHOD.

* METHOD token_all.

* FIELD-SYMBOLS: <line> LIKE LINE OF tb


l.

* LOOP AT tbl ASSIGNING <line>.


* REPLACE ALL OCCURRENCES OF token IN
<line>-value WITH value IGNORING CASE.

* ENDLOOP.

* ENDMETHOD.

* METHOD token_one.

* DATA: old_line LIKE LINE OF tbl.

* FIELD-SYMBOLS: <new_line> LIKE LINE O


F tbl.

* LOOP AT tbl INTO old_line WHERE name


= line.

* INSERT old_line INTO tbl INDEX sy-t


abix ASSIGNING <new_line>.

* CLEAR <new_line>-name.

* REPLACE ALL OCCURRENCES OF token IN


<new_line>-value WITH value IGNORING CASE
.

* ENDLOOP.

* ENDMETHOD.

* METHOD token_nvp.

* DATA: old_line LIKE LINE OF tbl.

* FIELD-SYMBOLS: <new_line> LIKE LINE O


F tbl.
* LOOP AT tbl INTO old_line WHERE name
= line.

* INSERT old_line INTO tbl INDEX sy-t


abix ASSIGNING <new_line>.

* CLEAR <new_line>-name.

* REPLACE ALL OCCURRENCES OF '{name}'


IN <new_line>-value WITH nvp-name IGNOR
ING CASE.

* REPLACE ALL OCCURRENCES OF '{value}


' IN <new_line>-value WITH nvp-value IGNOR
ING CASE.

* ENDLOOP.

* ENDMETHOD.

*ENDCLASS.
*-----------------------------------------
-----------------------------*

* CLASS lcl_http_base_handler DEFINI


TION

*-----------------------------------------
-----------------------------*

*
*-----------------------------------------
-----------------------------*

CLASS lcl_http_base_handler DEFINITION ABS


TRACT.

128
3
ELSE.

DATA: lo_handler TYPE REF TO lcl_h


ttp_base_handler.

1
CREATE OBJECT lo_handler TYPE (lv_
class)

3
CREATE OBJECT lo_handler

TYPE
(lv_class)

166
3
LOOP AT mt_handlers ASSIGNING <fs_hand
ler>.

IF <fs_handler>-name IS NOT INITIAL.

xml_name = cl_nwbc_utility=>escap
e_attribute( <fs_handler>-name ).

1
xml_descr = cl_nwbc_utility=>esca
pe_html( <fs_handler>-description ).

1
xml_descr = cl_http_utility=>esca
pe_html( <fs_handler>-description ).

320
4
register( iv_name = 'roles' iv_descrip
tion = 'Roles Services' iv_class = 'lcl_ht
tp_atom_role_handler' iv_method = 'execute
'). "#EC NOTEXT
ENDMETHOD. "construct
or

ENDCLASS. "lcl_http_ato
m_handler IMPLEMENTATION

0
908

*-----------------------------------------
-----------------------------*

* CLASS lcl_abap_codepage DEFINITION

*-----------------------------------------
-----------------------------*

* Fallback as CL_ABAP_CODEPAGE does not ex


ist in SAP_BASIS 700

*-----------------------------------------
-----------------------------*
CLASS lcl_abap_codepage DEFINITION FINAL.

PUBLIC SECTION.

CLASS-METHODS:

convert_to

IMPORTING

!source TYPE string

!codepage TYPE string D


EFAULT `UTF-8`

value(endian) TYPE abap_end


ian OPTIONAL

value(replacement) TYPE abap_rep


l DEFAULT '#'
value(ignore_cerr) TYPE abap_boo
l DEFAULT abap_false

RETURNING

value(result) TYPE xstring

RAISING

cx_parameter_invalid_range

cx_sy_codepage_converter_init

cx_sy_conversion_codepage

cx_parameter_invalid_type
,

sap_codepage

IMPORTING

!codepage TYPE string

RETURNING

value(sapcp) TYPE cpcodepage

RAISING

cx_parameter_invalid

.
ENDCLASS. "lcl_abap_cod
epage DEFINITION

*-----------------------------------------
-----------------------------*

* CLASS lcl_abap_codepage IMPLEMENTA


TION

*-----------------------------------------
-----------------------------*

*-----------------------------------------
-----------------------------*

CLASS lcl_abap_codepage IMPLEMENTATION.

METHOD convert_to.
* convert source to result using codepag
e

DATA: c2x TYPE REF TO cl_abap_conv_ou


t_ce,

scp TYPE abap_encod.

scp = sap_codepage( codepage ).

c2x = cl_abap_conv_out_ce=>create( enc


oding = scp

endian = endian replacement =


replacement

ignore_cerr = ignore_cerr ).

c2x->convert( EXPORTING data = sourc


e
IMPORTING buffer = resul
t ).

ENDMETHOD. "convert_t
o

"convert_to

METHOD sap_codepage.

IF codepage IS INITIAL.

* return current codepage

CALL FUNCTION 'SCP_GET_CODEPAGE_NUMB


ER'

EXPORTING

database_also = space
IMPORTING

appl_codepage = sapcp

EXCEPTIONS

OTHERS = 1.

IF sy-subrc <> 0.

CLEAR sapcp.

ENDIF.

ELSE.
* seach http codepages

DATA: name TYPE string. name = codep


age.

TRANSLATE name TO UPPER CASE.

CALL FUNCTION 'SCP_CODEPAGE_BY_EXTER


NAL_NAME'

EXPORTING

external_name = name

kind = 'H'

IMPORTING

sap_codepage = sapcp
EXCEPTIONS

not_found = 1

OTHERS = 2.

IF sy-subrc = 0. EXIT. ENDIF.

* seach java codepages

CALL FUNCTION 'SCP_CODEPAGE_BY_EXTER


NAL_NAME'

EXPORTING

external_name = name
kind = 'J'

IMPORTING

sap_codepage = sapcp

EXCEPTIONS

not_found = 1

OTHERS = 2.

IF sy-subrc = 0. EXIT. ENDIF.

IF codepage = 'UTF-16'.

* assume platform byte order


IF cl_abap_char_utilities=>endian
= 'L'.

sapcp = sap_codepage( `UTF-16LE`


).

ELSE.

sapcp = sap_codepage( `UTF-16BE`


).

ENDIF.

ELSE.

* raise exception, unknown codepage

RAISE EXCEPTION TYPE cx_parameter_


invalid_range

EXPORTING parameter = 'CODEP


AGE' value = codepage.

ENDIF.

ENDIF.

ENDMETHOD. "sap_codep
age

ENDCLASS. "lcl_abap_cod
epage IMPLEMENTATION

**----------------------------------------
------------------------------*
** CLASS lcl_testcase DEFINITION

**----------------------------------------
------------------------------*

*CLASS lcl_testcase DEFINITION INHERITING


FROM lcl_html.

* PUBLIC SECTION.

* METHODS:

* constructor IMPORTING server


TYPE REF TO if_http_server nwbc_runtime TY
PE REF TO if_nwbc_runtime,

* id IMPORTING VALUE(text)
TYPE string,

* title IMPORTING VALUE(text)


TYPE string,

* overview IMPORTING VALUE(text)


TYPE string,
* do IMPORTING VALUE(text)
TYPE string,

* observe IMPORTING VALUE(text)


TYPE string,

* repeat IMPORTING VALUE(text)


TYPE string,

* field IMPORTING name TYPE st


ring value TYPE csequence OPTIONAL,

* button IMPORTING name TYPE st


ring value TYPE string,

* raw_html IMPORTING VALUE(code)


TYPE string,

* javascript IMPORTING function TYP


E string OPTIONAL code TYPE string.

* DATA:
* nwbc_runtime TYPE REF TO if_nwbc_ru
ntime.

*ENDCLASS.

**----------------------------------------
------------------------------*

** CLASS lcl_testcase IMPLEMENTATION

**----------------------------------------
------------------------------*
*CLASS lcl_testcase IMPLEMENTATION.

* METHOD constructor.

* super->constructor( server ).

* server->stateful = 0. " drop the test


case session immediately afterwards

* me->nwbc_runtime = nwbc_runtime.

** Complete HTML document


* DEFINE emit. me->src( &1 ). END-OF-
DEFINITION.

* emit:

* ` <!DOCTYPE html>`,

* ` <html>`,

* ` <header>`,

* ` <title>{testcase-id}</title>
`,

* ` </header>`,

* ` <!--`,

* ` testcase:`,
* ` ATTRIBUTES:`,

* `FLD .{name}`,
"#EC NOTEXT

* ` METHODS:`,

* ` .get(name)`,

* ` .set(name,value)`,

* `JSF .{name}`,
"#EC NOTEXT

* `BTN .fire{name}()`,
"#EC NOTEXT

* ` -->`,

* ` <body>`,
* ` <script>`,

* ` function pro54_relax()`,

* ` {`,

* ` var hostname=location.ho
stname,nameparts=hostname.split("."),parts
length=nameparts.length,reference="parent"
;`,

* ` if(/^(\d|\.)+$/.test(hos
tname)) return true;`,

* ` if(partslength==1) retur
n true;`,

* ` var maxrelax=2;`,

* ` if(nameparts[partslength
-1]=="") maxrelax+=1;`,
* ` if(partslength<=maxrelax
) return true;`,

* ` try{`,

* ` document.domain=namepa
rts.slice(1).join(".");`,

* ` return true;`,

* ` }`,

* ` catch(e){`,

* ` return false;`,

* ` }`,

* ` }`,
* ` pro54_relax();`,

* ` </script>`,

* ` <script>`,

* ` var testcase = {};`,

* ` </script>`,

* ` <script>`,

* `FLD testcase.{name} = "{value}


";`,
"#EC NOTEXT

* ` function testcase.XmlReque
st(url) {`,
"#EC NOTEXT
* ` var oXmlHttpRequest = nu
ll; `,
"#EC NOTEXT

* ` if(window.XMLHttpRequest
) { `,
"#EC NOTEXT

* ` oXmlHttpRequest = new
XMLHttpRequest() `,
"#EC NOTEXT

* ` } `,
"#EC NOTEXT

* ` else { `,
"#EC NOTEXT

* ` try{ `,
"#EC NOTEXT

* ` oXmlHttpRequest = ne
w ActiveXObject("Msxml2.XMLHTTP"); `,
"#EC NOTEXT

* ` } `,
"#EC NOTEXT

* ` catch(e){ `,
"#EC NOTEXT
* ` oXmlHttpRequest = ne
w ActiveXObject("Microsoft.XMLHTTP"); `,
"#EC NOTEXT

* ` } `,
"#EC NOTEXT

* ` } `,
"#EC NOTEXT

* ` if(oXmlHttpRequest == nu
ll) return null; `,
"#EC NOTEXT

* ` oXmlHttpRequest.open("GE
T", url, false); `,
"#EC NOTEXT

* ` oXmlHttpRequest.send();`
,
"#EC NOTEXT

* ` return oXmlHttpRequest.r
esponseXML; `,
"#EC NOTEXT

* ` }`,
"#EC NOTEXT
* ` function testcase.addButto
n(name, onclick) {`,
"#EC NOTEXT

* ` inputfield = document.cr
eateElement("input");`,
"#EC NOTEXT

* ` inputfield.setAttribute(
"type", "submit");`,
"#EC NOTEXT

* ` inputfield.setAttribute(
"value", name);`,
"#EC NOTEXT

* ` inputfield.onclick = fun
ction() { eval(onclick); return false; }`,
"#EC NOTEXT

* ` document.all.buttons.app
endChild(inputfield);`,
"#EC NOTEXT

* ` }`,
"#EC NOTEXT

* ` function testcase.triggerR
oundTrip() {`,
"#EC NOTEXT

* ` for(name in testcase) if
(typeof testcase[name] != 'function') {`,
"#EC NOTEXT
* ` inputfield = document.
createElement("input");`,
"#EC NOTEXT

* ` inputfield.setAttribut
e("type", "hidden");`,
"#EC NOTEXT

* ` inputfield.setAttribut
e("name", name);`,
"#EC NOTEXT

* ` inputfield.setAttribut
e("value", testcase[name]);`,
"#EC NOTEXT

* ` document.forms[0].appe
ndChild(inputfield);`,
"#EC NOTEXT

* ` }`,
"#EC NOTEXT

* ` document.forms[0].submit
();`,
"#EC NOTEXT

* ` }`,
"#EC NOTEXT

* ` function testcase.get(name
) {`,
"#EC NOTEXT

* ` try {`,
"#EC NOTEXT

* ` return testcase[name];
`,
"#EC NOTEXT

* ` } catch(e) {}`,
"#EC NOTEXT

* ` return "";`,
"#EC NOTEXT

* ` }`,
"#EC NOTEXT

* ` function testcase.set(name
,value) {`,
"#EC NOTEXT

* ` try {`,
"#EC NOTEXT

* ` testcase[name] = value
;`,
"#EC NOTEXT
* ` document.getElementByI
d("fld." + name).innerText = value;`,
"#EC NOTEXT

* ` } catch(e) {}`,
"#EC NOTEXT

* ` return value;`,
"#EC NOTEXT

* ` }`,
"#EC NOTEXT

* `JSF function testcase.{name} {


`,
"#EC NOTEXT

* `JSF {value};`,
"#EC NOTEXT

* `JSF }`,
"#EC NOTEXT

* `BTN function testcase.fire{nam


e}() {`,
"#EC NOTEXT

* `BTN {value};`,
"#EC NOTEXT

* `BTN return false;`,


"#EC NOTEXT

* `BTN }`,
"#EC NOTEXT

* ` </script>`,
"#EC NOTEXT

* ` <form method="post">`,
"#EC NOTEXT

* ` <!-- title -->`,


"#EC NOTEXT

* ` <h1>{testcase-id}:{testcas
e-title}</h1>`,
"#EC NOTEXT

* ` <!-- overview -->`,


"#EC NOTEXT

* ` <p>`,
"#EC NOTEXT
* `OVER {text}`,
"#EC NOTEXT

* ` </p>`,
"#EC NOTEXT

* ` <!-- steps -->`,


"#EC NOTEXT

* ` <hr>`,
"#EC NOTEXT

* ` <ol>`,
"#EC NOTEXT

* `STEP <li>{step}`,
"#EC NOTEXT

* ` </ol>`,
"#EC NOTEXT

* ` <!-- fields -->`,


"#EC NOTEXT

* ` <hr>`,
"#EC NOTEXT
* ` <table>`,
"#EC NOTEXT

* `FLD <tr><td>{name}</td><td><
span id="fld.{name}">{value}</span></td></
tr>`, "#EC NOTEXT

* ` </table>`,
"#EC NOTEXT

* ` <!-- buttons -->`,


"#EC NOTEXT

* ` <hr>`,
"#EC NOTEXT

* ` <span id="buttons">`,
"#EC NOTEXT

* `BTN <input type="submit" val


ue="{name}" onclick="return testcase.fire{
name}();">`, "#EC NOTEXT

* ` </span>`,
"#EC NOTEXT
* ` <!-- HTML sequences -->`,
"#EC NOTEXT

* ` <hr>`,
"#EC NOTEXT

* `HTML {html}`,
"#EC NOTEXT

* ` </form>`,
"#EC NOTEXT

* ` <script>`,
"#EC NOTEXT

* `JS {value};`,
"#EC NOTEXT

* ` </script>`,
"#EC NOTEXT

* ` </body>`,
"#EC NOTEXT

* ` </html>`.
"#EC NOTEXT
*

* DATA: nwbc_context TYPE cl_nwbc=>t_co


ntext.

* nwbc_context = cl_nwbc=>context_get(
http_request = me->request ).

* IF nwbc_context-valid = abap_true.

* DATA: role_entry TYPE string.

* CONCATENATE nwbc_context-role_name
':' nwbc_context-role_id INTO role_entry.

* me->field( name = 'role_entry' valu


e = role_entry ).

* DATA: navigation_tree TYPE if_nwbc_


runtime=>t_navigation_tree.

* FIELD-SYMBOLS: <entry> LIKE LINE OF


navigation_tree.

* navigation_tree = nwbc_runtime->get
_navigation_tree( ).

* READ TABLE navigation_tree ASSIGNIN


G <entry> WITH KEY agr_name = nwbc_context
-role_name origin_id = nwbc_context-role_i
d.

* IF sy-subrc IS INITIAL.

* me->field( name = 'unique_id' va


lue = <entry>-unique_id ).

* me->field( name = 'text' va


lue = <entry>-text ).

* me->field( name = 'menu_level' va


lue = <entry>-menu_level ).

* ENDIF.
* ENDIF.

* DATA: roundtrips TYPE string.

* roundtrips = me->ff( 'roundtrips' ).

* roundtrips = roundtrips + 1.

* me->field( name = 'roundtrips' value


= roundtrips ).

* me->button( name = 'Roundtrip' value


= 'testcase.triggerRoundTrip();' ). "#EC N
OTEXT

* ENDMETHOD.

*
*

* METHOD id.

* me->token_all( token = '{testcase-id}


' value = text ).

* me->field( name = 'id' value = text )


.

* ENDMETHOD.

* METHOD title.
* me->token_all( token = '{testcase-tit
le}' value = text ).

* ENDMETHOD.

* METHOD overview.

* CONCATENATE text ` ` INTO text.

* me->token_one( line = 'OVER' token =


'{text}' value = text ).

* ENDMETHOD.

*
* METHOD do.

* CONCATENATE `DO ` text INTO text.

* me->token_one( line = 'STEP' token =


'{step}' value = text ).

* ENDMETHOD.

* METHOD observe.

* CONCATENATE `OBSERVE ` text INTO text


.

* me->token_one( line = 'STEP' token =


'{step}' value = text ).
* ENDMETHOD.

* METHOD repeat.

* CONCATENATE `REPEAT ` text INTO text.

* me->token_one( line = 'STEP' token =


'{step}' value = text ).

* ENDMETHOD.

* METHOD field.

* DATA nvp TYPE ihttpnvp.


* nvp-name = name.

* IF value IS SUPPLIED.

* nvp-value = value.

* ELSE.

* nvp-value = me->ff( nvp-name ).

* ENDIF.

* me->token_nvp( line = 'FLD' nvp = nvp


).

* ENDMETHOD.

*
* METHOD button.

* DATA nvp TYPE ihttpnvp.

* nvp-name = name.

* nvp-value = value.

* me->token_nvp( line = 'BTN' nvp = nv


p ).

* ENDMETHOD.

* METHOD javascript.
* DATA nvp TYPE ihttpnvp.

* nvp-name = function.

* nvp-value = code.

* REPLACE ALL OCCURRENCES OF '{crlf}' I


N nvp-value WITH crlf.

* IF nvp-name IS NOT INITIAL AND nvp-na


me NA '()'.

* CONCATENATE nvp-name '()' INTO nvp-


name.

* ENDIF.

* IF nvp-name IS NOT INITIAL.

* me->token_nvp( line = 'JSF' nvp =


nvp ).
* ELSE.

* me->token_nvp( line = 'JS' nvp =


nvp ).

* ENDIF.

* ENDMETHOD.

* METHOD raw_html.

* REPLACE ALL OCCURRENCES OF '{crlf}' I


N code WITH crlf.

* me->token_one( line = 'HTML' token =


'{html}' value = code ).
* ENDMETHOD.

*ENDCLASS.

**----------------------------------------
------------------------------*

** CLASS lcl_testcase_url_hash

**----------------------------------------
------------------------------*
*CLASS lcl_testcases DEFINITION.

* PUBLIC SECTION.

* CLASS-METHODS:

* execute IMPORTING testcase


TYPE string server TYPE REF TO if_http_se
rver nwbc_runtime TYPE REF TO if_nwbc_runt
ime.

* PRIVATE SECTION.

* CLASS-METHODS:

* home_page IMPO
RTING tc TYPE REF TO lcl_testcase,

* single_top_level IMPO
RTING tc TYPE REF TO lcl_testcase,
* deep_tree IMPO
RTING tc TYPE REF TO lcl_testcase,

* wide_tree IMPO
RTING tc TYPE REF TO lcl_testcase,

* url_hash IMPO
RTING tc TYPE REF TO lcl_testcase,

* navigation_tree IMPO
RTING tc TYPE REF TO lcl_testcase,

* navigation_tree_properties IMPO
RTING tc TYPE REF TO lcl_testcase,

* navigation_tree_i18n IMPO
RTING tc TYPE REF TO lcl_testcase,

* navigation_tree_apps IMPO
RTING tc TYPE REF TO lcl_testcase,

* navigation_tree_external_apps IMPO
RTING tc TYPE REF TO lcl_testcase,

* navigation_tree_fld_home_page IMPO
RTING tc TYPE REF TO lcl_testcase,
* navigation_tree_fld_servicemap IMPO
RTING tc TYPE REF TO lcl_testcase,

* navigation_tree_compression IMPO
RTING tc TYPE REF TO lcl_testcase,

* navigation_tree_remote IMPO
RTING tc TYPE REF TO lcl_testcase,

* menu_new IMPO
RTING tc TYPE REF TO lcl_testcase,

* menu_search IMPO
RTING tc TYPE REF TO lcl_testcase,

* menu_help IMPO
RTING tc TYPE REF TO lcl_testcase,

* menu_personalize IMPO
RTING tc TYPE REF TO lcl_testcase,

* link_collections IMPO
RTING tc TYPE REF TO lcl_testcase,

* link_collections_normal IMPO
RTING tc TYPE REF TO lcl_testcase,

* link_collections_add IMPO
RTING tc TYPE REF TO lcl_testcase,

* link_collections_deep IMPO
RTING tc TYPE REF TO lcl_testcase,

* link_collections_multi IMPO
RTING tc TYPE REF TO lcl_testcase,

* api IMPO
RTING tc TYPE REF TO lcl_testcase,

* api_test_canvas IMPO
RTING tc TYPE REF TO lcl_testcase,

* api_non_sap_portal IMPO
RTING tc TYPE REF TO lcl_testcase,

* api_atom IMPO
RTING tc TYPE REF TO lcl_testcase,

* api_slow_load IMPO
RTING tc TYPE REF TO lcl_testcase.
*ENDCLASS.

*CLASS lcl_testcases IMPLEMENTATION.

* METHOD execute.

* DATA: tc TYPE REF TO lcl_testcase.

* CREATE OBJECT tc EXPORTING server = s


erver nwbc_runtime = nwbc_runtime.

* CASE testcase.
* WHEN 'HOME_PAGE'.
home_page( tc ).

* WHEN 'SINGLE_TOP_LEVEL'.
single_top_level( tc ).

* WHEN 'DEEP_TREE'.
deep_tree( tc ).

* WHEN 'WIDE_TREE'.
wide_tree( tc ).

* WHEN 'URL_HASH'.
url_hash( tc ).

* WHEN 'NAVIGATION_TREE'.
navigation_tree( tc ).

* WHEN 'NAVIGATION_TREE.PROPERTIES'.
navigation_tree_properties( tc )
.

* WHEN 'NAVIGATION_TREE.I18N'.
navigation_tree_i18n( tc ).
* WHEN 'NAVIGATION_TREE.APPS'.
navigation_tree_apps( tc ).

* WHEN 'NAVIGATION_TREE.EXTERNAL_APPS
'. navigation_tree_external_apps( t
c ).

* WHEN 'NAVIGATION_TREE.FOLDER_HOME_P
AGE'. navigation_tree_fld_home_page( t
c ).

* WHEN 'NAVIGATION_TREE.FOLDER_SERVIC
E_MAP'. navigation_tree_fld_servicemap(
tc ).

* WHEN 'NAVIGATION_TREE.COMPRESSION'.
navigation_tree_compression( tc
).

* WHEN 'NAVIGATION_TREE.REMOTE'.
navigation_tree_remote( tc ).

* WHEN 'MENU.NEW'.
menu_new( tc ).

* WHEN 'MENU.SEARCH'.
menu_search( tc ).

* WHEN 'MENU.HELP'.
menu_help( tc ).
* WHEN 'MENU.PERSONALIZE'.
menu_personalize( tc ).

* WHEN 'LINK_COLLECTIONS'.
link_collections( tc ).

* WHEN 'LINK_COLLECTIONS.NORMAL'.
link_collections_normal( tc ).

* WHEN 'LINK_COLLECTIONS.ADD'.
link_collections_add( tc ).

* WHEN 'LINK_COLLECTIONS.DEEP'.
link_collections_deep( tc ).

* WHEN 'LINK_COLLECTIONS.MULTI'.
link_collections_multi( tc ).

* WHEN 'API'.
api( tc ).

* WHEN 'API.TEST_CANVAS'.
api_test_canvas( tc ).
* WHEN 'API.NON_SAP_PORTAL'.
api_non_sap_portal( tc ).

* WHEN 'API.ATOM'.
api_atom( tc ).

* WHEN 'API.SLOW_LOAD'.
api_slow_load( tc ).

* WHEN OTHERS.
cx_nwbc=>invalid_command( cmd =
testcase ).

* ENDCASE.

* tc->render( ).

* ENDMETHOD.

*
* METHOD home_page.

* tc->id( 'HOME_PAGE' ).

* tc->title( 'Test a Work Center with o


nly a Home Page' ). "#EC NOTEXT

* tc->overview( `This test case is a wo


rk center with only a home page, no other
navigation elements.` ). "#EC NOTEXT

* tc->observe( `that there are no top o


r left navigation elements.` ). "#EC NOTEX
T

* ENDMETHOD.

* METHOD single_top_level.
*

* tc->id( 'SINGLE_TOP_LEVEL'). "#EC NOT


EXT

* tc->title( 'Test 2nd Level Navigation


Already on Left Panel' ). "#EC NOTEXT

* tc->overview( `By default, the first


two level of navigation is shown at the to
p level,` ). "#EC NOTEXT

* tc->overview( `starting only with lev


el three to show the navigation on the lef
t panel.` ). "#EC NOTEXT

* tc->overview( `However, for some type


s of work center, it would be more benefic
ial to have already` ). "#EC NOTEXT

* tc->overview( `the second level navig


ation on the left panel, effectively havin
g only the` ). "#EC NOTEXT
* tc->overview( `work center itself as
top level navigation element.` ). "#EC NOT
EXT

* tc->do( `click on any shell entr


y on the left panel.` ). "#EC NOTEXT

* tc->observe( `that the second level n


avigation is placed on the left panel.` ).
"#EC NOTEXT

* tc->repeat( `a number of times.` ).


"#EC NOTEXT

* ENDMETHOD.

*
* METHOD deep_tree.

* tc->id( 'DEEP_TREE' ). "#EC NOTEXT

* tc->title( 'Test 10+ Level Deep Navig


ation Tree' ). "#EC NOTEXT

* tc->overview( `This test case is to l


ook at the handling of a very deep navigat
ion tree, at least three levels.` ). "#EC
NOTEXT

* tc->do( `click on a child folder


to navigate deeper into the navigation tr
ee.` ). "#EC NOTEXT
* tc->observe( `that the navigation tre
e is rendered correctly.` ). "#EC NOTEXT

* tc->repeat( `until the last leaf nod


e in the navigation tree is reached.` ). "
#EC NOTEXT

* ENDMETHOD.

* METHOD wide_tree.

* tc->id( 'WIDE_TREE' ). "#EC NOTEXT


* tc->title( 'Test 10+ Level Broad Navi
gation Tree (at Level 2 & 3)' ). "#EC NOTE
XT

* tc->overview( `Look at the handling o


f broad trees, especially at level 2 (whic
h is still in the top level navigation are
a)` ). "#EC NOTEXT

* tc->overview( `and level 3 (already o


n the left panel).` ). "#EC NOTEXT

* tc->do( `click on any shell entr


y on level 2 or level 3.` ). "#EC NOTEXT

* tc->observe( `that the navigation tre


e is rendered correctly.` ). "#EC NOTEXT

* tc->repeat( `until the width of the


tree is reached at both level 2 and level
3.` ). "#EC NOTEXT
*

* ENDMETHOD.

* METHOD url_hash.

* tc->id( 'URL_HASH' ).

"#EC NOTEXT

* tc->title( 'Test Stable Canvases Usin


g Hashed URLs (/url#hash)' ).
"#EC NOTEXT

*
* tc->overview( `Normally in a browser,
if URLs are loaded in sequence that are a
ll exactly the same, with a` ).
"#EC NOTEXT

* tc->overview( `difference only in a t


railing hash sequence (for example '/url#A
' and '/url#B'), then the browser` ).
"#EC NOTEXT

* tc->overview( `will not load the page


new, but only the hash on the URL is upda
ted. The browser page itself` ).
"#EC NOTEXT

* tc->overview( `is kept stable. NWBC u


ses same approach to keep a canvas stable
through a set of shell navigation ` ).
"#EC NOTEXT

* tc->overview( `steps. As long as the


following URLs are "stable", the shell nav
igation will not load the URLs` ).
"#EC NOTEXT

* tc->overview( `new, but just update t


he shell and set the new hash value in th
e canvas container the browser.` ).
"#EC NOTEXT

* tc->do( `click on any shell entr


y that is part of this test case (all have
same base name followed with a '#' sequen
ce).` ). "#EC NOTEXT

* tc->observe( `that the page counter s


tays stable.` ).
"#EC NOTEXT

* tc->observe( `that page hash value re


flects the value from navigation tree.` ).
"#EC NOTEXT

* tc->do( `press button to increas


e local counter.` ).
"#EC NOTEXT

* tc->do( `press button trigger ro


undtrip.` ).
"#EC NOTEXT

* tc->observe( `that the page counter s


tays stable.` ).
"#EC NOTEXT

* tc->observe( `that page hash value is


empty.` ).
"#EC NOTEXT

* tc->repeat( `all above steps.` ).

"#EC NOTEXT

* tc->field( name = 'counter' ).

"#EC NOTEXT
* tc->field( name = 'hash' ).

"#EC NOTEXT

* tc->button( name = 'Counter' value


= 'var c = testcase.get("counter"); testca
se.set("counter", ++c);' ).
"#EC NOTEXT

* tc->button( name = 'GetHash' value


= 'testcase.set("hash", document.location.
hash);' ).
"#EC NOTEXT

* tc->javascript( function = 'UpdateHas


h()' code = 'testcase.fireGetHash(); windo
w.setTimeout("testcase.UpdateHash();", 100
0);' ). "#EC NOTEXT

* tc->javascript(
code = 'testcase.UpdateHash();' ).
"#EC NOTEXT

* ENDMETHOD.
*

* METHOD navigation_tree.

* tc->id( 'NAVIGATION_TREE' ).
"#EC NOTEXT

* tc->title( 'Set of Test Cases Around


Navigation Tree' ).
"#EC NOTEXT

* tc->overview( `Within the PFCG it is


possible to configure different types of s
cenarios` ). "#EC NOTEXT

* tc->overview( `for visualization with


NWBC. This folder contains test cases for
most` ). "#EC NOTEXT

* tc->overview( `of the possible scenar


ios.` ).
"#EC NOTEXT
* tc->do( `run the test cases at level
2 one by one.` ).
"#EC NOTEXT

* ENDMETHOD.

* METHOD navigation_tree_properties.

* tc->id( 'NAVIGATION_TREE.PROPERTIES'
).
"#EC NOTEXT

* tc->title( 'Test Different Node Prope


rties in Navigation Tree' ).
"#EC NOTEXT

* tc->overview( `There are a number of


settings that are possible for each node`
). "#EC NOTEXT

* tc->overview( `entry. Test these thro


ugh.` ).
"#EC NOTEXT
* tc->observe( `that the first entry is
visualized as "normal".` ).
"#EC NOTEXT

* tc->observe( `that the second entry i


s visualized as "emphasized".` ).
"#EC NOTEXT

* tc->observe( `that the third entry is


visualized as "disabled".` ).
"#EC NOTEXT

* tc->observe( `that the fourth entry h


as a tooltip.` ).
"#EC NOTEXT

* tc->observe( `that there is NO "hidde


n" entry.` ).
"#EC NOTEXT

* tc->do( `attempt to select the d


isabled entry.` ).
"#EC NOTEXT

* tc->observe( `that it is not possible


to select the disabled entry.` ).
"#EC NOTEXT

* ENDMETHOD.
*

* METHOD navigation_tree_i18n.

* tc->id( 'NAVIGATION_TREE.I18N' ).
"#EC NOTEXT

* tc->title( 'Test Different Names with


International Characters' ).
"#EC NOTEXT

* tc->overview( `Test different types o


f characters with the names, especially te
st` ). "#EC NOTEXT

* tc->overview( `internationalization c
haracters and special characters that caus
e` ). "#EC NOTEXT

* tc->overview( `problems especially in


HTML shells.` ).
"#EC NOTEXT

* tc->observe( `Oyz` ).
"#EC *
* tc->observe( `@5A@ SAP Icon` ).
"#EC NOTEXT

* tc->observe( `'Single Quoted Text'` )


.
"#EC NOTEXT

* tc->observe( `"Double Quoted Text"` )


.
"#EC NOTEXT

* tc->observe( `&lt;i&gt;HTML Sequence


Italics&lt;/i&gt;` ).
"#EC NOTEXT

* tc->observe( `Percentage Character (%


20)` ).
"#EC NOTEXT

* ENDMETHOD.

* METHOD navigation_tree_apps.
* tc->id( 'NAVIGATION_TREE.APPS' ).
"#E
C NOTEXT

* tc->title( 'Test Different Applicatio


ns within the Shell' ).
"#E
C NOTEXT

* tc->overview( `Test different types o


f applications within the shell. Especiall
y of interest in this test is` ). "#E
C NOTEXT

* tc->overview( `to see that these appl


ications can be started and that it is pos
sible to navigate between them.` ). "#E
C NOTEXT

* tc->do( 'systematically click th


rough all applications in the sub tree and
start each application.' ). "#E
C NOTEXT

* tc->observe( 'that each application i


s started correctly.' ).
"#E
C NOTEXT
* tc->do( 'click again on the "App
lication" node at level 2 for this test ca
se.' ). "#E
C NOTEXT

* tc->observe( 'that there are no addit


ional started sessions dangling.' ).
"#E
C NOTEXT

* tc->do( 'click to start again an


y of the URL based applications.' ).
"#E
C NOTEXT

* tc->do( 'use shift-click on any


link in the URL based application to start
link in a new window.' ). "#E
C NOTEXT

* tc->observe( 'that the page is starte


d in a new NWBC window.' ).
"#E
C NOTEXT

* tc->repeat( 'systematically SHIFT-c


lick through all applications in the sub t
ree and start each application.' ). "#E
C NOTEXT

* tc->observe( 'that each application i


s started correctly in a NEW window.' ).
"#E
C NOTEXT

* DATA: session_html TYPE string.


* DATA: sessions TYPE STANDARD TABLE OF
uinfo WITH DEFAULT KEY,

* session LIKE LINE OF sessions.

* CALL FUNCTION 'TH_USER_LIST' TABLES l


ist = sessions.

* LOOP AT sessions INTO session WHERE b


name = sy-uname AND mandt = sy-mandt.

* CONCATENATE session_html

* `<tr><td>&nbsp;` sessio
n-term `</td><td>&nbsp;` session-zeit `</t
d><td>&nbsp;` session-tcode `</td></tr>`

* INTO session_html.

* ENDLOOP.
* CONCATENATE `<table border="1">` sess
ion_html `</table>` INTO session_html.

* tc->raw_html( session_html ).

* ENDMETHOD.

* METHOD navigation_tree_external_apps.

* tc->id( 'NAVIGATION_TREE.EXTERNAL_APP
S' ).
"
#EC NOTEXT

* tc->title( 'Test Different External A


pplications within the Shell' ).
"
#EC NOTEXT

* tc->overview( `Test different types o


f external (local) applications within the
shell. This is especially complex` ). "
#EC NOTEXT

* tc->overview( `as it is not possible


to always start these applications within
NWBC for HTML.` ). "
#EC NOTEXT

* tc->do( `***NOT READY YET***` ).


"
#EC NOTEXT

* ENDMETHOD.

* METHOD navigation_tree_fld_home_page.

* tc->id( 'NAVIGATION_TREE.FOLDER_HOME_
PAGE' ).
"
#EC NOTEXT

* tc->title( 'Test Folder with only Hom


e Page' ).
"
#EC NOTEXT

* tc->overview( `It is possible that a


folder can have only a home page, then it
acts effectively as link entry.` ). "
#EC NOTEXT
* tc->overview( `In addition, this test
case also covers empty folders. Empty fo
lders are filtered and not shown in` ). "
#EC NOTEXT

* tc->overview( `the navigation tree. B


efore this folder is an "Empty Folder" tha
t should not be visible.` ). "
#EC NOTEXT

* tc->observe( `that before this entry


there is NO "Empty Folder".` ).
"
#EC NOTEXT

* tc->observe( `that there are no furth


er navigation elements for this folder.` )
. "
#EC NOTEXT

* ENDMETHOD.

* METHOD navigation_tree_fld_servicemap.

* tc->id( 'NAVIGATION_TREE.FOLDER_SERVI
CE_MAP' ).
"
#EC NOTEXT
* tc->title( 'Test Folder with a Servic
e Map' ).
"
#EC NOTEXT

* tc->overview( `Test a folder with a s


ervice map configured. If a folder has als
o a home page (or here a test case),` ). "
#EC NOTEXT

* tc->overview( `the home page has prio


rity. As such, have separate folder with s
ervice map defined.` ). "
#EC NOTEXT

* tc->overview( `To test is one that th


e service map shows the sub navigation tre
e and two that the service map` ). "
#EC NOTEXT

* tc->overview( `can also be used to tr


igger navigation.` ).
"
#EC NOTEXT

* tc->do( `select the service map folde


r.` ).
"
#EC NOTEXT

* tc->observe( `that the service map re


flects the sub tree.` ).
"
#EC NOTEXT

* tc->do( `select an entry from the ser


vice map.` ).
"
#EC NOTEXT

* tc->observe( `that shell navigates to


the entry.` ).
"
#EC NOTEXT

* tc->observe( `that the selected entry


on the shell is updated to reflect the se
lected service map entry.` ). "
#EC NOTEXT

* ENDMETHOD.

* METHOD navigation_tree_compression.

* tc->id( 'NAVIGATION_TREE.COMPRESSION'
).
"
#EC NOTEXT

* tc->title( 'Test Navigation Tree Comp


ression' ).
"
#EC NOTEXT

* tc->overview( `Within the navigation


tree, compression of the navigation tree i
s done on` ). "
#EC NOTEXT

* tc->overview( `comparison of folder n


ames. As long as folder names are the same
, their content` ). "
#EC NOTEXT
* tc->overview( `will be merged into si
ngle folders. Duplicate entries are remove
d (actually hidden).` ). "
#EC NOTEXT

* tc->do( `expand complete sub tree.` )


.
"
#EC NOTEXT

* tc->observe( `that there is exactly o


ne of each named entry visible.` ).
"
#EC NOTEXT

* ENDMETHOD.

* METHOD navigation_tree_remote.

* tc->id( 'NAVIGATION_TREE.REMOTE' ).
"
#EC NOTEXT

* tc->title( 'Test Navigation Tree Remo


te' ).
"
#EC NOTEXT

* tc->overview( `Within the navigation


tree, it is possible to define that specif
ic applications` ). "
#EC NOTEXT

* tc->overview( `should be started on a


remote system. This is done by configurin
g the target` ). "
#EC NOTEXT

* tc->overview( `system for the specifi


c entry. For this test case, the transacti
on SM51 is` ). "
#EC NOTEXT

* tc->overview( `started on a number of


systems. ***CAUTION***: This test case ca
n only work` ). "
#EC NOTEXT

* tc->overview( `if the SM59 targets SA


P_NWBC_TEST_ROLE_X to ... _Z has been defi
ned.` ). "
#EC NOTEXT

* tc->do( `select the SM51 local entry.


` ).
"
#EC NOTEXT

* tc->observe( `that transaction SM51 i


s started locally.` ).
"
#EC NOTEXT

* tc->do( `select the SM51 on X entry.`


).
"
#EC NOTEXT
* tc->observe( `that transaction SM51 i
s started on a different box.` ).
"
#EC NOTEXT

* tc->repeat( `for Y & Z entries.` ).


"
#EC NOTEXT

* tc->do( `select the SM51 on UNDEFINED


entry.` ).
"
#EC NOTEXT

* tc->observe( `that an error message i


s displayed that the target is unknown.` )
. "
#EC NOTEXT

* ENDMETHOD.

* METHOD menu_new.

* tc->id( 'MENU.NEW' ).
"#
EC NOTEXT

* tc->title( 'Test Case to Add a Comple


te New Menu Tree' ).
"#
EC NOTEXT

* tc->overview( `It is possible to defi


ne a complete new menu entry for NWBC, sta
rting at the` ). "#
EC NOTEXT

* tc->overview( `root level. This test


case defines such a menu tree.` ).
"#
EC NOTEXT

* tc->do( `open the "Test Case" menu an


d select any of the test case entries.` ).
"#
EC NOTEXT

* tc->observe( `that the test case entr


y is loaded in the shell canvas.` ).
"#
EC NOTEXT

* tc->do( `open the "Test Case" menu an


d specifically select an entry from the su
b folder.` ). "#
EC NOTEXT

* tc->observe( `that the test case entr


y is loaded in the shell canvas.` ).
"#
EC NOTEXT

* tc->do( `open the "Test Case" menu an


d select any of the test case entries with
SHIFT-CLICK.` ). "#
EC NOTEXT
* tc->observe( `that the test case entr
y is loaded in a new window.` ).
"#
EC NOTEXT

* ENDMETHOD.

* METHOD menu_search.
"#
EC NOTEXT

* tc->id( 'MENU.SEARCH' ).
"#
EC NOTEXT

* tc->title( 'Test Case to Extend Searc


h Menu' ).
"#
EC NOTEXT

* tc->overview( `This test case is abou


t adding own search providers, effectively
extending the` ). "#
EC NOTEXT

* tc->overview( `list of search provide


rs. Of interest is how the query is passed
with a token` ). "#
EC NOTEXT
* tc->overview( `replacement on {0}.` )
.
"#
EC NOTEXT

* tc->do( `entry any search query strin


g.` ).
"#
EC NOTEXT

* tc->do( `select one of the "Test Case


" search engines.` ).
"#
EC NOTEXT

* tc->do( `press "Search" button.` ).


"#
EC NOTEXT

* tc->observe( `that a new window is o


pened with the test case entry.` ).
"#
EC NOTEXT

* tc->observe( `that a search query is


correctly reflected in this new window.` )
. "#
EC NOTEXT

* tc->field( 'query' ).
"#
EC NOTEXT

* ENDMETHOD.
"#
EC NOTEXT

*
"#
EC NOTEXT

*
"#
EC NOTEXT

* METHOD menu_help.
"#
EC NOTEXT

* tc->id( 'MENU.HELP' ).
"#
EC NOTEXT

* tc->title( 'Test Case to Extend Help


Menu' ).
"#
EC NOTEXT

* tc->overview( `This test case is abou


t extending the help menu. Typical use cou
ld be to provide` ). "#
EC NOTEXT

* tc->overview( `local help information


, for example a link to a wiki page with
hotline numbers.` ). "#
EC NOTEXT

* tc->do( `open the "Help" menu and sel


ect any of the test case entries.` ).
"#
EC NOTEXT

* tc->observe( `that the test case entr


y is loaded in the shell canvas.` ).
"#
EC NOTEXT
* tc->do( `open the "Help" menu and spe
cifically select an entry from the sub fol
der.` ). "#
EC NOTEXT

* tc->observe( `that the test case entr


y is loaded in the shell canvas.` ).
"#
EC NOTEXT

* tc->do( `open the "Help" menu and sel


ect any of the test case entries with SHIF
T-CLICK.` ). "#
EC NOTEXT

* tc->observe( `that the test case entr


y is loaded in a new window.` ).
"#
EC NOTEXT

* ENDMETHOD.
"#
EC NOTEXT

*
"#
EC NOTEXT

*
"#
EC NOTEXT

* METHOD menu_personalize.
"#
EC NOTEXT

* tc->id( 'MENU.PERSONALIZE' ).
"#
EC NOTEXT

* tc->title( 'Test Case to Extend Perso


nalize Menu' ).
"#
EC NOTEXT

* tc->overview( `Test case to extend pe


rsonalize menu.` ).
"#
EC NOTEXT

* tc->do( `open the "Personalize" menu


and select any of the test case entries.`
). "#
EC NOTEXT

* tc->observe( `that the test case entr


y is loaded in the shell canvas.` ).
"#
EC NOTEXT

* tc->do( `open the "Personalize" menu


and specifically select an entry from the
sub folder.` ). "#
EC NOTEXT

* tc->observe( `that the test case entr


y is loaded in the shell canvas.` ).
"#
EC NOTEXT

* tc->do( `open the "Personalize" menu


and select any of the test case entries wi
th SHIFT-CLICK.` ). "#
EC NOTEXT

* tc->observe( `that the test case entr


y is loaded in a new window.` ).
"#
EC NOTEXT
* ENDMETHOD.
"#
EC NOTEXT

*
"#
EC NOTEXT

*
"#
EC NOTEXT

* METHOD link_collections.
"#
EC NOTEXT

* tc->id( 'LINK_COLLECTIONS' ).
"#
EC NOTEXT

* tc->title( 'Test Case for a Number of


Link Collection Possibilities' ).
"#
EC NOTEXT

* tc->overview( `Link Collections are s


pecial type of navigation nodes that are a
lways` ). "#
EC NOTEXT

* tc->overview( `shown after the normal


navigation nodes and has the purpose to p
rovide` ). "#
EC NOTEXT

* tc->overview( `additional information


. Typical examples could be link collectio
ns for` ). "#
EC NOTEXT

* tc->overview( `"You can also..." or "


Additional Transactions" or "Knowledge Bas
e".` ). "#
EC NOTEXT

* tc->overview( `Given the nature of li


nk collections to be that of providing add
itional` ). "#
EC NOTEXT

* tc->overview( `context related infora


mtion, they are so designed that link coll
ections` ). "#
EC NOTEXT

* tc->overview( `will always open in a


new window.` ).
"#
EC NOTEXT

* tc->do( `click any link collection en


try on the left panel.` ).
"#
EC NOTEXT

* tc->observe( `that the entry is start


ed in a NEW window.` ).
"#
EC NOTEXT

* tc->repeat( `run the test cases at le


vel 2 one by one.` ).
"#
EC NOTEXT

* ENDMETHOD.
"#
EC NOTEXT
*
"#
EC NOTEXT

*
"#
EC NOTEXT

* METHOD link_collections_normal.
"#
EC NOTEXT

* tc->id( 'LINK_COLLECTIONS.NORMAL' ).
"#
EC NOTEXT

* tc->title( 'Test Case for a Normal Fo


lder with Inherited Link Collection' ).
"#
EC NOTEXT

* tc->overview( `Link collections are i


nherited from parent to child folders.` ).
"#
EC NOTEXT

* tc->overview( `At this folder we have


NO link collection defined. This folder o
nly` ). "#
EC NOTEXT

* tc->overview( `inherits the link coll


ection from the parent folder.` ).
"#
EC NOTEXT

* tc->do( `click on normal entry on the


left panel.` ).
"#
EC NOTEXT
* tc->observe( `that the entry is start
ed in the shell canvas.` ).
"#
EC NOTEXT

* tc->do( `click any link collection en


try on the left panel.` ).
"#
EC NOTEXT

* tc->observe( `that the entry is start


ed in a NEW window.` ).
"#
EC NOTEXT

* tc->observe( `that the entry starts t


he inherited application (test case "LINK_
COLLECTIONS").` ). "#
EC NOTEXT

* ENDMETHOD.
"#
EC NOTEXT

*
"#
EC NOTEXT

*
"#
EC NOTEXT

* METHOD link_collections_add.
"#
EC NOTEXT

* tc->id( 'LINK_COLLECTIONS.ADD' ).
"#
EC NOTEXT

* tc->title( 'Test Case Showing Adding/


Extending Link Collections' ).
"#
EC NOTEXT

* tc->overview( `At any folder level it


is possible to extend a link collection b
y` ). "#
EC NOTEXT

* tc->overview( `adding more entries in


to an existing link collection inherited f
rom` ). "#
EC NOTEXT

* tc->overview( `the parent folder or b


y defining a new link collection.` ).
"#
EC NOTEXT

* tc->observe( `that the link collectio


n inherited from parent node has been exte
nded with addition nodes.` ). "#
EC NOTEXT

* tc->observe( `that a new/additional l


ink collection has been added.` ).
"#
EC NOTEXT

* tc->do( `click any "inherited" link c


ollection entry on the left panel.` ).
"#
EC NOTEXT

* tc->observe( `that the entry is start


ed in a NEW window.` ).
"#
EC NOTEXT
* tc->observe( `that the entry starts t
he inherited application (test case "LINK_
COLLECTIONS").` ). "#
EC NOTEXT

* tc->do( `click any "added" link colle


ction entry on the left panel.` ).
"#
EC NOTEXT

* tc->observe( `that the entry is start


ed in a NEW window.` ).
"#
EC NOTEXT

* tc->observe( `that the entry starts t


he added application (test case "LINK_COLL
ECTIONS.ADD").` ). "#
EC NOTEXT

* ENDMETHOD.
"#
EC NOTEXT

*
"#
EC NOTEXT

*
"#
EC NOTEXT

* METHOD link_collections_deep.
"#
EC NOTEXT

* tc->id( 'LINK_COLLECTIONS.DEEP' ).
"#
EC NOTEXT

* tc->title( 'Test Case for Deeply Stru


ctured Link Collections' ).
"#
EC NOTEXT

* tc->overview( `It is possible that li


nk collections can have sub folders.` ).
"#
EC NOTEXT

* tc->do( `select any of the link colle


ction entries from the deeply structured c
ollection.` ). "#
EC NOTEXT

* tc->observe( `that the navigation tre


e rendering is correct.` ).
"#
EC NOTEXT

* tc->observe( `that the entry is start


ed in a NEW window.` ).
"#
EC NOTEXT

* tc->repeat( `a number of times to dep


th of Folder 3.3.3` ).
"#
EC NOTEXT

* ENDMETHOD.
"#
EC NOTEXT

*
"#
EC NOTEXT
*
"#
EC NOTEXT

* METHOD link_collections_multi.
"#
EC NOTEXT

* tc->id( 'LINK_COLLECTIONS.MULTI' ).
"#
EC NOTEXT

* tc->title( 'Test Case for Multiple Li


nk Collections' ).
"#
EC NOTEXT

* tc->overview( `It is also possible to


define multiple link collections in one f
older.` ). "#
EC NOTEXT

* tc->overview( `The link collections w


ill be rendered below one another.` ).
"#
EC NOTEXT

* tc->do( `click any link collection en


try on the left panel.` ).
"#
EC NOTEXT

* tc->observe( `that the entry is start


ed in a NEW window.` ).
"#
EC NOTEXT

* tc->repeat( `test for second link col


lection.` ).
"#
EC NOTEXT

* ENDMETHOD.
"#
EC NOTEXT

*
"#
EC NOTEXT

*
"#
EC NOTEXT

* METHOD api.
"#
EC NOTEXT

* tc->id( 'API' ).
"#
EC NOTEXT

* tc->title( 'Test Case for Differ APIs


' ).
"#
EC NOTEXT

* tc->overview( `This node just contain


s a set of test cases for different APIs a
nd other` ). "#
EC NOTEXT

* tc->overview( `miscellaneous aspects.


` ).
"#
EC NOTEXT
* tc->do( `run the test cases at level
2 one by one.` ).
"#
EC NOTEXT

* ENDMETHOD.
"#
EC NOTEXT

*
"#
EC NOTEXT

*
"#
EC NOTEXT

* METHOD api_test_canvas.
"#
EC NOTEXT

*
"#
EC NOTEXT

* tc->id( 'API.TEST_CANVAS' ).
"#
EC NOTEXT

* tc->title( 'Test Case for Constructin


g Server Based Tests' ).
"#
EC NOTEXT

* tc->overview( `For example, during au


thentication tests it is important to veri
fy that` ). "#
EC NOTEXT
* tc->overview( `the user is actually l
ogged on in the correct client and languag
e.` ). "#
EC NOTEXT

* tc->overview( `This test canvas echo'


s as much data as possible to construct su
ch test cases.` ). "#
EC NOTEXT

* tc->observe( `that the logged on lang


auge is as expected.` ).
"#
EC NOTEXT

* tc->observe( `that the logged on clie


nt is as expected.` ).
"#
EC NOTEXT

*
"#
EC NOTEXT

* tc->field( name = 'SY_UNAME'


value = sy-uname ).
"#
EC NOTEXT

* tc->field( name = 'SY_MANDT'


value = sy-mandt ).
"#
EC NOTEXT

* tc->field( name = 'SY_LANGU'


value = sy-langu ).
"#
EC NOTEXT

* tc->field( name = 'SY_SYSID'


value = sy-sysid ).
"#
EC NOTEXT

* tc->field( name = 'SY_SAPRL'


value = sy-saprl ).
"#
EC NOTEXT

** tc->field( name = 'SY_DATUM'


value = sy-datum ).
"#
EC NOTEXT

** tc->field( name = 'SY_UZEIT'


value = sy-uzeit ).
"#
EC NOTEXT

* tc->field( name = 'SY_HOST'


value = sy-host ).
"#
EC NOTEXT

* tc->field( name = 'Http_fqBaseUrl'


value = tc->nwbc_runtime->full_qualified_b
ase_url ). "#
EC NOTEXT

* tc->field( name = 'Http_fqHost'


value = tc->nwbc_runtime->full_qualified_h
ost ). "#
EC NOTEXT

* tc->field( name = 'Http_BaseUrl'


value = tc->nwbc_runtime->base_url ).
"#
EC NOTEXT

* tc->field( name = 'Http_SessionId'


value = tc->server->session_id ).
"#
EC NOTEXT
* tc->field( name = 'Runtime_Version'
value = tc->nwbc_runtime->version ).
"#
EC NOTEXT

* tc->field( name = 'Runtime_Cockpit'


value = tc->nwbc_runtime->cockpit ).
"#
EC NOTEXT

* "#EC NOTEXT

* ENDMETHOD.
"#
EC NOTEXT

*
"#
EC NOTEXT

*
"#
EC NOTEXT

* METHOD api_non_sap_portal.
"#
EC NOTEXT

* tc->id( 'API.NON_SAP_PORTAL' ).
"#
EC NOTEXT

* tc->title( 'Test Case for Non-SAP Por


tal Integration' ).
"#
EC NOTEXT

* tc->overview( `For NON-SAP portal int


egration, the approach is used of running
NWBC for HTML` ). "#
EC NOTEXT

* tc->overview( `in an embedded mode. W


hat this test case does, is to simulate su
ch a "foreign"` ). "#
EC NOTEXT

* tc->overview( `portal and then loads


NWBC for HTML embedded.` ).
"#
EC NOTEXT

*
"#
EC NOTEXT

* tc->do( `click on the button to load


the test role in embedded mode.` ).
"#
EC NOTEXT

* tc->observe( `that the specified role


is loaded correctly in bottom part of pag
e.` ). "#
EC NOTEXT

* tc->observe( `that the rendering is c


orrect, with an imbedded shell rendered.`
). "#
EC NOTEXT

*
"#
EC NOTEXT
* tc->raw_html( `<iframe id="nwbc_for_h
tml" src="about:blank" style="width:100%;h
eight:500px"></iframe>` ). "#
EC NOTEXT

*
"#
EC NOTEXT

* DATA: url TYPE string.


"#
EC NOTEXT

* url = cl_nwbc=>url_construct( role =


'SAP_NWBC_TEST_ROLE' canvas__window = cl_n
wbc=>canvas__window__embedded ). "#
EC NOTEXT

* CONCATENATE `document.all.nwbc_for_ht
ml.src="` url `";` INTO url.
"#
EC NOTEXT

* tc->button( name = 'LoadRole' value =


url ).
"#
EC NOTEXT

* ENDMETHOD.
"#
EC NOTEXT

*
"#
EC NOTEXT

*
"#
EC NOTEXT

* METHOD api_atom.
"#
EC NOTEXT

* tc->id( 'API.ATOM' ).
"#
EC NOTEXT

* tc->title( 'Test Case for ~atom Feede


r' ).
"#
EC NOTEXT

* tc->overview( `The NWBC runtime expor


ts all roles in an ATOM feed (via URL /nwb
c/~atom)` ). "#
EC NOTEXT

* tc->overview( `to allow other portals


to integrate SAP role content via NWBC fo
r HTML.` ). "#
EC NOTEXT

* tc->overview( `This test case simulat


es such a "foreign" portal.` ).
"#
EC NOTEXT

*
"#
EC NOTEXT

* tc->do( `click on a button to load a


specific role.` ).
"#
EC NOTEXT
* tc->observe( `that the specified role
is loaded correctly in bottom part of pag
e.` ). "#
EC NOTEXT

* tc->repeat( `for all roles.` ).


"#
EC NOTEXT

*
"#
EC NOTEXT

* tc->raw_html( `<iframe id="nwbc_for_h


tml" src="about:blank" style="width:100%;h
eight:500px"></iframe>` ). "#
EC NOTEXT

* tc->javascript( function = `LoadURL(u


rl)` code = `document.all.nwbc_for_html.sr
c=url;` ). "#
EC NOTEXT

*
"#
EC NOTEXT

** Example XML snippet from ATOM feed.


"#
EC NOTEXT

** <entry>
"#
EC NOTEXT

** <title type="text">SAP NetWeaver


Business Client Test Role</title>
** <id>/nwbc/~atom/roles/list('SAP_
NWBC_TEST_ROLE')</id>

** <updated>2010-04-26T16:18:06Z</u
pdated>

** <link rel="edit" title="Link" hr


ef="list('SAP_NWBC_TEST_ROLE')" />

** <link rel="alternate" type="text


/html" href="http://ldciyi3.wdf.sap.corp:5
0033/nwbc/SAP_NWBC_TEST_ROLE/~canvas;windo
w=embedded/sitemap/?sap-client=000"/>

** </entry>

* DATA: code TYPE string.

* CONCATENATE

* `{crlf} var xmlDoc = testc


ase.XmlRequest("/nwbc/~atom/roles/list");`
"#
EC NOTEXT

* `{crlf} var links = xmlDoc


.getElementsByTagName("link");`
"#
EC NOTEXT

* `{crlf} for(var i=0; i<lin


ks.length; i++) {`
"#
EC NOTEXT

* `{crlf} var attrRel = l


inks[i].attributes[0].nodeValue;`
"#
EC NOTEXT

* `{crlf} var attrHref = l


inks[i].attributes[2].nodeValue;`
"#
EC NOTEXT

* `{crlf} if(attrRel == "a


lternate") {`
"#
EC NOTEXT

* `{crlf} var startPos =


attrHref.indexOf("/nwbc/") + 6;`
"#
EC NOTEXT

* `{crlf} var endPos =


attrHref.indexOf("/~canvas");`
"#
EC NOTEXT

* `{crlf} var roleName =


attrHref.substring(startPos, endPos);`
"#
EC NOTEXT

* `{crlf} testcase.addBu
tton(roleName,"testcase.LoadURL('"+attrHre
f+"');");` "#
EC NOTEXT
* `{crlf} }`
"#
EC NOTEXT

* `{crlf} }`
"#
EC NOTEXT

* INTO code.

* tc->javascript( code ).

* ENDMETHOD.

* METHOD api_slow_load.
"#
EC NOTEXT

* tc->id( 'API.SLOW_LOAD' ).
"#
EC NOTEXT

* tc->title( 'Test Case that Loads Very


Slowly' ).
"#
EC NOTEXT

* tc->overview( `This node is just a pa


ge that loads incredibly slow to test for
time-out situations,` ). "#
EC NOTEXT

* tc->overview( `especially with the au


tomated tested.` ).
"#
EC NOTEXT

* tc->observe( `that the canvas is load


ed correctly, that is sufficient.` ).
"#
EC NOTEXT

* WAIT UP TO 75 SECONDS.

* ENDMETHOD.
"#
EC NOTEXT

*
*

*ENDCLASS.

LIMU
CINC
CL_NWBC_RUNTIME35=============CCAU

00006

LIMU
CINC
CL_NWBC_RUNTIME35=============CCAU

00000

36
1
\\\\\no_empty_blocks/////
1
\\\\\comments_ignored/////
1
\\\\\delta_normalized/////
3
\\\\\allowed/////
FORM
*
3
\\\\\allowed/////
FUNCTION
*
3
\\\\\allowed/////
MODULE
**
3
\\\\\allowed/////
REPORT
*
3
\\\\\allowed/////
PROGRAM
*
3
\\\\\allowed/////
FUNCTION-POOL
*
4
\\\\\allowed/////
CLASS
*
DEFINITION
4
\\\\\allowed/////
CLASS
*
IMPLEMENTATION
5
\\\\\forbidden/////
CLASS
*
DEFINITION
DEFERRED
5
\\\\\forbidden/////
CLASS
*
DEFINITION
LOAD
6
\\\\\forbidden/////
CLASS
*
DEFINITION
LOCAL
FRIENDS
3
\\\\\allowed/////
AT
LINE-SELECTION
3
\\\\\allowed/////
AT
USER-COMMAND
4
\\\\\allowed/////
AT
SELECTION-SCREEN
**
3
\\\\\allowed/////
AT
PF*
2
\\\\\allowed/////
INITIALIZATION
2
\\\\\allowed/////
START-OF-SELECTION
2
\\\\\allowed/////
END-OF-SELECTION
3
\\\\\allowed/////
TOP-OF-PAGE
**
2
\\\\\allowed/////
END-OF-PAGE
3
\\\\\allowed/////
GET
**
3
\\\\\forbidden/////
GET
BADI
3
\\\\\forbidden/////
GET
BIT
3
\\\\\forbidden/////
GET
CONNECTION
3
\\\\\forbidden/////
GET
CURSOR
3
\\\\\forbidden/////
GET
DATASET
3
\\\\\forbidden/////
GET
LOCALE
3
\\\\\forbidden/////
GET
PARAMETER
3
\\\\\forbidden/////
GET
PF-STATUS
3
\\\\\forbidden/////
GET
PROPERTY
3
\\\\\forbidden/////
GET
REFERENCE
3
\\\\\forbidden/////
GET
RUN
3
\\\\\forbidden/////
GET
TIME
4
3
CLASS
CL_NWBC_OBN_PARAM_TEST
DEFINITION
1
1
0
21
CLASS cl_nwbc_obn_param_test DEFINITION FO
R TESTING

DURATION SHORT

RISK LEVEL HARMLESS FINAL

*?#<asx:abap xmlns:asx="http://www.sap.com
/abapxml" version="1.0">

*?<asx:values>

*?<TESTCLASS_OPTIONS>

*?<TEST_CLASS>cl_Nwbc_Obn_Param_Test
*?</TEST_CLASS>

*?<TEST_MEMBER>f_Cut

*?</TEST_MEMBER>

*?<OBJECT_UNDER_TEST>CL_NWBC

*?</OBJECT_UNDER_TEST>

*?<OBJECT_IS_LOCAL/>

*?<GENERATE_FIXTURE/>

*?<GENERATE_CLASS_FIXTURE/>

*?<GENERATE_INVOCATION/>
*?<GENERATE_ASSERT_EQUAL/>

*?</TESTCLASS_OPTIONS>

*?</asx:values>

*?</asx:abap>

5
CLASS cl_nwbc_obn_param_test DEFINITION FO
R TESTING FINAL

" DURATION SHORT RISK LEVEL HARMLESS -->


not supported in SAP_BASIS700

"#AU Duration Short

"#AU Risk_Level Harmless


.

3
CLASS
CL_NWBC_OBN_PARAM_TEST
IMPLEMENTATION
2
316
3
rv_unique_key = iv_unique_key.

ELSE.

"create unique id

1
rv_unique_key = cl_system_uuid=>
create_uuid_x16_static( ).

11
TRY.

CALL METHOD ('CL_SYSTEM_UUID


')=>create_uuid_x16_static

RECEIVING
uuid = rv_unique_key.

CATCH cx_sy_dyn_call_error.

DATA lv_guid16 TYPE guid_16.

CALL FUNCTION 'GUID_CREATE'

IMPORTING

ev_guid_16 = lv_guid16.

rv_unique_key = lv_guid16.

ENDTRY.
333
4
RAISE EXCEPTION TYPE cx_nwbc_stati
c_check

EXPORTING

textid = cx_nwbc_static_chec
k=>cx_obn_param_format_invalid

previous = lx_error.

1
CATCH cx_uuid_error INTO lx_error.

1
CATCH cx_root INTO lx_error.

3
CLASS
LC_UT_ASSOCIATED
DEFINITION
1
1
0
22
CLASS lc_ut_associated DEFINITION FOR TEST
ING DURATION SHORT RISK LEVEL HARMLESS.
*?#<asx:abap xmlns:asx="http://www.sap.com
/abapxml" version="1.0">

*?<asx:values>

*?<TESTCLASS_OPTIONS>

*?<TEST_CLASS>lc_ut_associated

*?</TEST_CLASS>

*?<TEST_MEMBER>f_Cut

*?</TEST_MEMBER>

*?<OBJECT_UNDER_TEST>CL_NWBC_RUNTIME35

*?</OBJECT_UNDER_TEST>
*?<OBJECT_IS_LOCAL/>

*?<GENERATE_FIXTURE>X

*?</GENERATE_FIXTURE>

*?<GENERATE_CLASS_FIXTURE>X

*?</GENERATE_CLASS_FIXTURE>

*?<GENERATE_INVOCATION>X

*?</GENERATE_INVOCATION>

*?<GENERATE_ASSERT_EQUAL>X
*?</GENERATE_ASSERT_EQUAL>

*?</TESTCLASS_OPTIONS>

*?</asx:values>

*?</asx:abap>

5
CLASS lc_ut_associated DEFINITION FOR TEST
ING FINAL

" DURATION SHORT RISK LEVEL HARMLESS -->


not supported in SAP_BASIS700

"#AU Duration Short

"#AU Risk_Level Harmless

.
3
CLASS
LC_UT_ASSOCIATED
IMPLEMENTATION
3
13
3
IF lv_role_exist EQ abap_false.

DATA: lv_detail TYPE string.

CONCATENATE `Please import role ` mc


_associated_role ` from Y3S(111) system in
to ` sy-sysid `(` sy-mandt `)` ` to proces
s unit tests.` INTO lv_detail.

1
cl_abap_unit_assert=>abort( msg = `T
est role is not available.` detail = lv_de
tail ).

1
cl_aunit_assert=>abort( msg = `Test
role is not available.` detail = lv_detail
).

31
3
ENDMETHOD. "teardown
METHOD assert_equals.

1
assertion_failed = cl_abap_unit_assert
=>assert_equals( act = act exp = exp msg =
msg level = level ).

1
assertion_failed = cl_aunit_assert=>as
sert_equals( act = act exp = exp msg = msg
level = level ).

52
4
ENDIF.

<fs> = cl_nwbc_runtime35=>encode_uniqu
e_id( agr_name = lv_agr_name origin_id = l
v_origin_id ).

1
ENDMETHOD.

1
ENDMETHOD. "append_un
ique_id

LIMU
CINC
CL_NWBC_RUNTIME35=============CCIMP

00002

LIMU
CINC
CL_NWBC_RUNTIME35=============CCIMP

00000

36
1
\\\\\no_empty_blocks/////
1
\\\\\comments_not_ignored/////
1
\\\\\delta_normalized/////
3
\\\\\allowed/////
FORM
*
3
\\\\\allowed/////
FUNCTION
*
3
\\\\\allowed/////
MODULE
**
3
\\\\\allowed/////
REPORT
*
3
\\\\\allowed/////
PROGRAM
*
3
\\\\\allowed/////
FUNCTION-POOL
*
4
\\\\\allowed/////
CLASS
*
DEFINITION
4
\\\\\allowed/////
CLASS
*
IMPLEMENTATION
5
\\\\\forbidden/////
CLASS
*
DEFINITION
DEFERRED
5
\\\\\forbidden/////
CLASS
*
DEFINITION
LOAD
6
\\\\\forbidden/////
CLASS
*
DEFINITION
LOCAL
FRIENDS
3
\\\\\allowed/////
AT
LINE-SELECTION
3
\\\\\allowed/////
AT
USER-COMMAND
4
\\\\\allowed/////
AT
SELECTION-SCREEN
**
3
\\\\\allowed/////
AT
PF*
2
\\\\\allowed/////
INITIALIZATION
2
\\\\\allowed/////
START-OF-SELECTION
2
\\\\\allowed/////
END-OF-SELECTION
3
\\\\\allowed/////
TOP-OF-PAGE
**
2
\\\\\allowed/////
END-OF-PAGE
3
\\\\\allowed/////
GET
**
3
\\\\\forbidden/////
GET
BADI
3
\\\\\forbidden/////
GET
BIT
3
\\\\\forbidden/////
GET
CONNECTION
3
\\\\\forbidden/////
GET
CURSOR
3
\\\\\forbidden/////
GET
DATASET
3
\\\\\forbidden/////
GET
LOCALE
3
\\\\\forbidden/////
GET
PARAMETER
3
\\\\\forbidden/////
GET
PF-STATUS
3
\\\\\forbidden/////
GET
PROPERTY
3
\\\\\forbidden/////
GET
REFERENCE
3
\\\\\forbidden/////
GET
RUN
3
\\\\\forbidden/////
GET
TIME
5
3
CLASS
LCL_ISO
IMPLEMENTATION
1
24
4
endmethod. "from_lang

endclass. "iso IMPLEMEN


TATION

1
*-----------------------------------------
-----------------------------*

*-----------------------------------------
-----------------------------*
3
CLASS
LCL_NWBC_NAV_TREE_ACCESS
DEFINITION
1
53
3

endclass. "lcl_nwbc_nav
_tree_access DEFINITION

1
*-----------------------------------------
-----------------------------*

*-----------------------------------------
-----------------------------*

3
CLASS
CL_GET_NAVIGATION_TREES_TEST
DEFINITION
1
1
0
4
class cl_get_navigation_trees_test definit
ion for testing

duration short

risk level harmless

final.

5
CLASS cl_get_navigation_trees_test DEFINIT
ION FOR TESTING FINAL

" DURATION SHORT RISK LEVEL HARMLESS ->


not supported on 700

"#AU Duration Short

"#AU Risk_Level Harmless

.
3
CLASS
CL_GET_NAVIGATION_TREES_TEST
IMPLEMENTATION
2
8
5
data: lo_nwbc_runtime type ref to if_n
wbc_runtime,

lo_nwbc_runtime35 type ref to if


_nwbc_runtime35,

lo_cl_nwbc_runtime type ref to c


l_nwbc_runtime35,

lt_sap_menu type if_nwbc_runtime


=>t_navigation_tree,

ls_sap_menu_info type if_nwbc_ru


ntime=>t_navigation_tree_info,

2
ls_sap_menu_info_internal type c
l_nwbc_runtime35=>t_sap_menu_info,

ls_user_info type if_nwbc_runtim


e=>t_user_info.
1
ls_sap_menu_info_internal TYPE c
l_nwbc_runtime35=>t_sap_menu_info.

16
4
assert lo_nwbc_runtime is not initial.

"get rid of any buffer

lo_cl_nwbc_runtime ?= lo_nwbc_runtime.

ls_sap_menu_info_internal = lo_cl_nwbc
_runtime->get_sap_menu_info( ).

2
ls_user_info = lo_nwbc_runtime->get_us
er_info( ).

delete from database nwbc_nav_tree(nt)


id ls_sap_menu_info_internal-cluster_id.

1
DELETE FROM DATABASE nwbc_nav_tree(nt)
ID ls_sap_menu_info_internal-cluster_id.
3
CLASS
CL_ENTERPRISE_SEARCH_TEST
DEFINITION
1
1
0
3
class cl_enterprise_search_test definition
for testing

duration short

risk level harmless final.

5
CLASS cl_enterprise_search_test DEFINITION
FOR TESTING FINAL

" DURATION SHORT RISK LEVEL HARMLESS ->


not supported on 700

"#AU Duration Short

"#AU Risk_Level Harmless


.

LIMU
CINC
CL_NWBC_SAPGUI_SHORTCUT=======CCAU

99997

LIMU
CINC
CL_NWBC_SAPGUI_SHORTCUT=======CCAU

00000

31
1
\\\\\no_empty_blocks/////
1
\\\\\comments_not_ignored/////
1
\\\\\delta_normalized/////
3
\\\\\allowed/////
FORM
*
3
\\\\\allowed/////
FUNCTION
*
3
\\\\\allowed/////
MODULE
**
3
\\\\\allowed/////
REPORT
*
3
\\\\\allowed/////
PROGRAM
*
3
\\\\\allowed/////
FUNCTION-POOL
*
3
\\\\\allowed/////
AT
LINE-SELECTION
3
\\\\\allowed/////
AT
USER-COMMAND
4
\\\\\allowed/////
AT
SELECTION-SCREEN
**
3
\\\\\allowed/////
AT
PF*
2
\\\\\allowed/////
INITIALIZATION
2
\\\\\allowed/////
START-OF-SELECTION
2
\\\\\allowed/////
END-OF-SELECTION
3
\\\\\allowed/////
TOP-OF-PAGE
**
2
\\\\\allowed/////
END-OF-PAGE
3
\\\\\allowed/////
GET
**
3
\\\\\forbidden/////
GET
BADI
3
\\\\\forbidden/////
GET
BIT
3
\\\\\forbidden/////
GET
CONNECTION
3
\\\\\forbidden/////
GET
CURSOR
3
\\\\\forbidden/////
GET
DATASET
3
\\\\\forbidden/////
GET
LOCALE
3
\\\\\forbidden/////
GET
PARAMETER
3
\\\\\forbidden/////
GET
PF-STATUS
3
\\\\\forbidden/////
GET
PROPERTY
3
\\\\\forbidden/////
GET
REFERENCE
3
\\\\\forbidden/////
GET
RUN
3
\\\\\forbidden/////
GET
TIME
1
0
1
1
0
0
68
*"* use this source file for your ABAP uni
t test classes

CLASS lc_sapgui_shortcut_test DEFINITION F


OR TESTING FINAL.

PRIVATE SECTION.

METHODS: setup.
METHODS: teardown.

METHODS: get_shortcut FOR TESTING.

ENDCLASS. "lc_sapgui_shortcut_test

*-----------------------------------------
-----------------------------*

* CLASS lc_sapgui_shortcut_test IMPL


EMENTATION

*-----------------------------------------
-----------------------------*

*
*-----------------------------------------
-----------------------------*

CLASS lc_sapgui_shortcut_test IMPLEMENTATI


ON.

METHOD setup.

ENDMETHOD. "setup

METHOD teardown.
ENDMETHOD. "teardown

METHOD get_shortcut.

DATA:

lo_shortcut TYPE REF TO cl_nwbc_sapg


ui_shortcut,

* lt_exp TYPE string_table,

lt_act TYPE string_table.


* CREATE OBJECT lo_shortcut

* EXPORTING

* iv_system_id = SY-SYSID

* iv_client_id = SY-MANDT

* iv_system_description =

* iv_application_server_name =

* iv_system_number =
* it_gateway_hosts =

* iv_message_server_name =

* iv_service_port =

* iv_logon_group =

* iv_sm59_destination =

* iv_report_name =

* iv_report_variant =

* iv_title =

* iv_system_command =
* iv_transaction_code =

* iv_skip_initial_screen = ABAP_FAL
SE

* it_parameters =

* iv_user_id = SY-UNAME

* iv_language = SY-LANGU

* iv_password =

* iv_trace_level = CL_NWBC_SAPGUI_S
HORTCUT=>SC_NO_TRACE

* iv_work_directory =

* iv_gui_size = CL_NWBC_SAPGUI_SHOR
TCUT=>SC_GUI_SIZE_NORMAL_WINDOW

* iv_reuse_existing_connection = AB
AP_TRUE

* .

CREATE OBJECT lo_shortcut EXPORTING iv


_transaction_code = 'se38'.

lo_shortcut->get_shortcut( IMPORTING e
t_shortcut = lt_act ).

cl_aunit_assert=>assert_not_initial( a
ct = lt_act msg = 'Basics SAPGUI shotcut g
eneration failed!').
ENDMETHOD. "get_Shortcut

ENDCLASS. "lc_sapgui_shortcut_test

LIMU
CINC
CL_NWBC_SAPGUI_SHORTCUT=======CCDEF

99997

LIMU
CINC
CL_NWBC_SAPGUI_SHORTCUT=======CCDEF

00000

36
1
\\\\\no_empty_blocks/////
1
\\\\\comments_not_ignored/////
1
\\\\\delta_normalized/////
3
\\\\\allowed/////
FORM
*
3
\\\\\allowed/////
FUNCTION
*
3
\\\\\allowed/////
MODULE
**
3
\\\\\allowed/////
REPORT
*
3
\\\\\allowed/////
PROGRAM
*
3
\\\\\allowed/////
FUNCTION-POOL
*
4
\\\\\allowed/////
CLASS
*
DEFINITION
4
\\\\\allowed/////
CLASS
*
IMPLEMENTATION
5
\\\\\forbidden/////
CLASS
*
DEFINITION
DEFERRED
5
\\\\\forbidden/////
CLASS
*
DEFINITION
LOAD
6
\\\\\forbidden/////
CLASS
*
DEFINITION
LOCAL
FRIENDS
3
\\\\\allowed/////
AT
LINE-SELECTION
3
\\\\\allowed/////
AT
USER-COMMAND
4
\\\\\allowed/////
AT
SELECTION-SCREEN
**
3
\\\\\allowed/////
AT
PF*
2
\\\\\allowed/////
INITIALIZATION
2
\\\\\allowed/////
START-OF-SELECTION
2
\\\\\allowed/////
END-OF-SELECTION
3
\\\\\allowed/////
TOP-OF-PAGE
**
2
\\\\\allowed/////
END-OF-PAGE
3
\\\\\allowed/////
GET
**
3
\\\\\forbidden/////
GET
BADI
3
\\\\\forbidden/////
GET
BIT
3
\\\\\forbidden/////
GET
CONNECTION
3
\\\\\forbidden/////
GET
CURSOR
3
\\\\\forbidden/////
GET
DATASET
3
\\\\\forbidden/////
GET
LOCALE
3
\\\\\forbidden/////
GET
PARAMETER
3
\\\\\forbidden/////
GET
PF-STATUS
3
\\\\\forbidden/////
GET
PROPERTY
3
\\\\\forbidden/////
GET
REFERENCE
3
\\\\\forbidden/////
GET
RUN
3
\\\\\forbidden/////
GET
TIME
0
LIMU
CINC
CL_NWBC_SAPGUI_SHORTCUT=======CCIMP

99997

LIMU
CINC
CL_NWBC_SAPGUI_SHORTCUT=======CCIMP

00000

36
1
\\\\\no_empty_blocks/////
1
\\\\\comments_not_ignored/////
1
\\\\\delta_normalized/////
3
\\\\\allowed/////
FORM
*
3
\\\\\allowed/////
FUNCTION
*
3
\\\\\allowed/////
MODULE
**
3
\\\\\allowed/////
REPORT
*
3
\\\\\allowed/////
PROGRAM
*
3
\\\\\allowed/////
FUNCTION-POOL
*
4
\\\\\allowed/////
CLASS
*
DEFINITION
4
\\\\\allowed/////
CLASS
*
IMPLEMENTATION
5
\\\\\forbidden/////
CLASS
*
DEFINITION
DEFERRED
5
\\\\\forbidden/////
CLASS
*
DEFINITION
LOAD
6
\\\\\forbidden/////
CLASS
*
DEFINITION
LOCAL
FRIENDS
3
\\\\\allowed/////
AT
LINE-SELECTION
3
\\\\\allowed/////
AT
USER-COMMAND
4
\\\\\allowed/////
AT
SELECTION-SCREEN
**
3
\\\\\allowed/////
AT
PF*
2
\\\\\allowed/////
INITIALIZATION
2
\\\\\allowed/////
START-OF-SELECTION
2
\\\\\allowed/////
END-OF-SELECTION
3
\\\\\allowed/////
TOP-OF-PAGE
**
2
\\\\\allowed/////
END-OF-PAGE
3
\\\\\allowed/////
GET
**
3
\\\\\forbidden/////
GET
BADI
3
\\\\\forbidden/////
GET
BIT
3
\\\\\forbidden/////
GET
CONNECTION
3
\\\\\forbidden/////
GET
CURSOR
3
\\\\\forbidden/////
GET
DATASET
3
\\\\\forbidden/////
GET
LOCALE
3
\\\\\forbidden/////
GET
PARAMETER
3
\\\\\forbidden/////
GET
PF-STATUS
3
\\\\\forbidden/////
GET
PROPERTY
3
\\\\\forbidden/////
GET
REFERENCE
3
\\\\\forbidden/////
GET
RUN
3
\\\\\forbidden/////
GET
TIME
0
LIMU
CINC
CL_NWBC_SAPGUI_SHORTCUT=======CCMAC

99997

LIMU
CINC
CL_NWBC_SAPGUI_SHORTCUT=======CCMAC
00000

36
1
\\\\\no_empty_blocks/////
1
\\\\\comments_not_ignored/////
1
\\\\\delta_normalized/////
3
\\\\\allowed/////
FORM
*
3
\\\\\allowed/////
FUNCTION
*
3
\\\\\allowed/////
MODULE
**
3
\\\\\allowed/////
REPORT
*
3
\\\\\allowed/////
PROGRAM
*
3
\\\\\allowed/////
FUNCTION-POOL
*
4
\\\\\allowed/////
CLASS
*
DEFINITION
4
\\\\\allowed/////
CLASS
*
IMPLEMENTATION
5
\\\\\forbidden/////
CLASS
*
DEFINITION
DEFERRED
5
\\\\\forbidden/////
CLASS
*
DEFINITION
LOAD
6
\\\\\forbidden/////
CLASS
*
DEFINITION
LOCAL
FRIENDS
3
\\\\\allowed/////
AT
LINE-SELECTION
3
\\\\\allowed/////
AT
USER-COMMAND
4
\\\\\allowed/////
AT
SELECTION-SCREEN
**
3
\\\\\allowed/////
AT
PF*
2
\\\\\allowed/////
INITIALIZATION
2
\\\\\allowed/////
START-OF-SELECTION
2
\\\\\allowed/////
END-OF-SELECTION
3
\\\\\allowed/////
TOP-OF-PAGE
**
2
\\\\\allowed/////
END-OF-PAGE
3
\\\\\allowed/////
GET
**
3
\\\\\forbidden/////
GET
BADI
3
\\\\\forbidden/////
GET
BIT
3
\\\\\forbidden/////
GET
CONNECTION
3
\\\\\forbidden/////
GET
CURSOR
3
\\\\\forbidden/////
GET
DATASET
3
\\\\\forbidden/////
GET
LOCALE
3
\\\\\forbidden/////
GET
PARAMETER
3
\\\\\forbidden/////
GET
PF-STATUS
3
\\\\\forbidden/////
GET
PROPERTY
3
\\\\\forbidden/////
GET
REFERENCE
3
\\\\\forbidden/////
GET
RUN
3
\\\\\forbidden/////
GET
TIME
0
LIMU
CINC
CL_URL========================CCAU

99997

LIMU
CINC
CL_URL========================CCAU

00000

31
1
\\\\\no_empty_blocks/////
1
\\\\\comments_ignored/////
1
\\\\\delta_normalized/////
3
\\\\\allowed/////
FORM
*
3
\\\\\allowed/////
FUNCTION
*
3
\\\\\allowed/////
MODULE
**
3
\\\\\allowed/////
REPORT
*
3
\\\\\allowed/////
PROGRAM
*
3
\\\\\allowed/////
FUNCTION-POOL
*
3
\\\\\allowed/////
AT
LINE-SELECTION
3
\\\\\allowed/////
AT
USER-COMMAND
4
\\\\\allowed/////
AT
SELECTION-SCREEN
**
3
\\\\\allowed/////
AT
PF*
2
\\\\\allowed/////
INITIALIZATION
2
\\\\\allowed/////
START-OF-SELECTION
2
\\\\\allowed/////
END-OF-SELECTION
3
\\\\\allowed/////
TOP-OF-PAGE
**
2
\\\\\allowed/////
END-OF-PAGE
3
\\\\\allowed/////
GET
**
3
\\\\\forbidden/////
GET
BADI
3
\\\\\forbidden/////
GET
BIT
3
\\\\\forbidden/////
GET
CONNECTION
3
\\\\\forbidden/////
GET
CURSOR
3
\\\\\forbidden/////
GET
DATASET
3
\\\\\forbidden/////
GET
LOCALE
3
\\\\\forbidden/////
GET
PARAMETER
3
\\\\\forbidden/////
GET
PF-STATUS
3
\\\\\forbidden/////
GET
PROPERTY
3
\\\\\forbidden/////
GET
REFERENCE
3
\\\\\forbidden/////
GET
RUN
3
\\\\\forbidden/////
GET
TIME
1
0
1
1
0
0
107

*-----------------------------------------
-----------------------------*
* CLASS lc_Url_Test DEFINITION

*-----------------------------------------
-----------------------------*

*-----------------------------------------
-----------------------------*

CLASS lc_url_test DEFINITION FOR TESTING F


INAL.

PRIVATE SECTION.

DATA: lo_url TYPE REF TO cl_url. "cla


ss under test

METHODS: setup.
METHODS: teardown.

METHODS: get_transaction_name FOR TEST


ING.

METHODS: get_wda_name FOR TESTING.

ENDCLASS. "lc_url_test
*-----------------------------------------
-----------------------------*

* CLASS lc_url_test IMPLEMENTATION

*-----------------------------------------
-----------------------------*

*-----------------------------------------
-----------------------------*

CLASS lc_url_test IMPLEMENTATION.

METHOD setup.

CREATE OBJECT lo_url.


ENDMETHOD. "setup

METHOD teardown.

ENDMETHOD. "teardown

METHOD get_transaction_name.

DATA: ev_name TYPE string,


ev_skip_sel_screen TYPE abap_boo
l,

et_parameters TYPE tihttpnv


p,

lt_parameters LIKE et_param


eters.

FIELD-SYMBOLS: <param> LIKE LINE OF


lt_parameters.

""""""""""""""""""""""""""""""""""""""
""""""""""""""""""""""""""

" test transaction exctraction with sk


ip selection scring, parameters and encodi
ng

cl_url=>get_transaction_name( EXPORTIN
G iv_url = 'https://ldciq7k.wdf.sap.corp:4
4304/sap/bc/gui/sap/its/webgui;~sysid=Q7K;
~service=3204?~transaction=*ICLCDC02+PAR1%
3D%C3%84R%3B%2FPAR2%2FX%3D%C3%9C%3BDYNP_OK
CODE%3Ddo-it'
IMPORTIN
G ev_name = ev_name ev_skip_sel_screen = e
v_skip_sel_screen et_parameters = et_param
eters ).

cl_aunit_assert=>assert_equals( act =
ev_name exp = 'ICLCDC02' msg = 'Transactio
n name is wrong!' ).

cl_aunit_assert=>assert_equals( act =
ev_skip_sel_screen exp = abap_true msg = '
Skip Selection Screen is not recognized' )
.

CLEAR lt_parameters.

APPEND INITIAL LINE TO lt_parameters A


SSIGNING <param>.

<param>-name = 'PAR1'. <param>-value =


'R'. "#EC STRING_OK

APPEND INITIAL LINE TO lt_parameters A


SSIGNING <param>.

<param>-name = '/PAR2/X'. <param>-valu


e = ''. "#EC STRING_OK

APPEND INITIAL LINE TO lt_parameters A


SSIGNING <param>.

<param>-name = 'DYNP_OKCODE'. <param>-


value = 'do-it'.

cl_aunit_assert=>assert_equals( act =
et_parameters exp = lt_parameters msg = 'T
ransaction paramaters parsed incorrectly')
.

""""""""""""""""""""""""""""""""""""""
""""""""""""""""""""""""""

" test transaction exctraction with ex


tra percentage encoding for skip selection
string and space

cl_url=>get_transaction_name( EXPORTIN
G iv_url = 'https://ldciq7k.wdf.sap.corp:4
4304/sap/bc/gui/sap/its/webgui;~sysid=Q7K;
~service=3204?~transaction=%2AICLCDC02%20P
AR1%3D%C3%84R%3B%2FPAR2%2FX%3D%C3%9C%3BDYN
P_OKCODE%3DDOIT'
IMPORTIN
G ev_name = ev_name ev_skip_sel_screen = e
v_skip_sel_screen et_parameters = et_param
eters ).

cl_aunit_assert=>assert_equals( act =
ev_name exp = 'ICLCDC02' msg = 'Transactio
n name is wrong!' ).

cl_aunit_assert=>assert_equals( act =
ev_skip_sel_screen exp = abap_true msg = '
Skip Selection Screen is not recognized' )
.

CLEAR lt_parameters.

APPEND INITIAL LINE TO lt_parameters A


SSIGNING <param>.

<param>-name = 'PAR1'. <param>-value =


'R'. "#EC STRING_OK

APPEND INITIAL LINE TO lt_parameters A


SSIGNING <param>.
<param>-name = '/PAR2/X'. <param>-valu
e = ''. "#EC STRING_OK

APPEND INITIAL LINE TO lt_parameters A


SSIGNING <param>.

<param>-name = 'DYNP_OKCODE'. <param>-


value = 'DOIT'.

cl_aunit_assert=>assert_equals( act =
et_parameters exp = lt_parameters msg = 'T
ransaction paramaters parsed incorrectly')
.

""""""""""""""""""""""""""""""""""""""
""""""""""""""""""""""""""

" test transaction exctraction with re


lative url and space percentage encoding

cl_url=>get_transaction_name( EXPORTIN
G iv_url = '/sap/bc/gui/sap/its/webgui;~sy
sid=Q7K?~transaction=ICLCDC02%20PAR1%3D%C3
%84R%3B%2FPAR2%2FX%3D%C3%9C%3B'
IMPORTIN
G ev_name = ev_name ev_skip_sel_screen = e
v_skip_sel_screen et_parameters = et_param
eters ).

cl_aunit_assert=>assert_equals( act =
ev_name exp = 'ICLCDC02' msg = 'Transactio
n name is wrong!' ).

cl_aunit_assert=>assert_equals( act =
ev_skip_sel_screen exp = abap_false msg =
'Skip Selection Screen is not recognized'
).

CLEAR lt_parameters.

APPEND INITIAL LINE TO lt_parameters A


SSIGNING <param>.

<param>-name = 'PAR1'. <param>-value =


'R'. "#EC STRING_OK

APPEND INITIAL LINE TO lt_parameters A


SSIGNING <param>.
<param>-name = '/PAR2/X'. <param>-valu
e = ''. "#EC STRING_OK

cl_aunit_assert=>assert_equals( act =
et_parameters exp = lt_parameters msg = 'T
ransaction paramaters parsed incorrectly')
.

ENDMETHOD. "get_transaction_name

METHOD get_wda_name.
DATA: rv_name TYPE string.

""""""""""""""""""""""""""""""""""""""
""""""""""""""""""""""""""

" test WDA exctraction with relative p


ath

rv_name = cl_url=>get_wda_name( iv_url


= '/sap/bc/webdynpro/SAP/FPM_WIRE_TEST_OV
P?sap-wd-configId=FPM_WIRE_TEST_OVP_APPCC&
sap-client=100&sap-language=EN' ).

cl_aunit_assert=>assert_equals( act =
rv_name exp = 'FPM_WIRE_TEST_OVP\FPM_WIRE_
TEST_OVP_APPCC' msg = 'WDA name/configurat
ion is wrong!' ).

ENDMETHOD. "get_wda_name
ENDCLASS. "lc_url_test

LIMU
METH
CL_LSAPI_MANAGER GET_INSTANCE

00004

LIMU
METH
CL_LSAPI_MANAGER GET_INSTANCE

00000

3
1
\\\\\no_empty_blocks/////
1
\\\\\comments_not_ignored/////
1
\\\\\delta_normalized/////
1
0
2
6
3
IF m_instance IS NOT BOUND.

DATA: retval TYPE sydebug,


2
retval_its TYPE sydebug,

ls_context TYPE cl_nwbc=>t_co


ntext.

1
ls_context TYPE cl_nwbc=>t_co
ntext.

11
3

CALL FUNCTION 'ICF_IS_PLUGIN_SESSION


'

IMPORTING

2
plugin_session = retval
its_plugin_session = retval_its.

1
plugin_session = retval.

LIMU
METH
CL_LSAPI_MANAGER NAVIGATE_TO_
TRANSACTION
00002

LIMU
METH
CL_LSAPI_MANAGER NAVIGATE_TO_
TRANSACTION
00000

3
1
\\\\\no_empty_blocks/////
1
\\\\\comments_not_ignored/////
1
\\\\\delta_normalized/////
1
0
1
22
4
ENDIF.

CONCATENATE if_lsapi=>gc_s_protocol-tran
saction lv_sm59_alias `~` lv_transaction I
NTO url.
1
IF url IS NOT REQUESTED.

8
IF force_sapgui IS SUPPLIED.

cl_nwbc=>replace_query_parameter( EXPO
RTING param_name = if_lsapi=>mc_tr_forc
e_sapgui

param_value = force_sapgui

param_default = abap_false

CHAN
GING url = url ).

ENDIF.
IF url IS NOT REQUESTED.

LIMU
METH
CL_NWBC INITIALIZE_C
LIENT
00004

LIMU
METH
CL_NWBC INITIALIZE_C
LIENT
00000

3
1
\\\\\no_empty_blocks/////
1
\\\\\comments_not_ignored/////
1
\\\\\delta_normalized/////
1
0
3
7
3
ls_context = context_get( ).

IF ls_context-valid EQ abap_false.
3

ls_context-valid = abap_true.

ls_context-nwbc_shell = cl_nwbc=>for_h
tml.

3
ev_already_initialized = abap_false.

ls_context-valid = abap_true.

ls_context-nwbc_shell = nwbc_shell.

32
3
IF sb_nwbc_tab_browsing IS SUPPLIED.

cl_lsapi_manager=>set_supported( EXP
ORTING feature = if_lsapi=>mc_feature_nwbc
_tab_browsing

set = sb_nwbc_tab_browsing

4
CHA
NGING support_bits = ls_context-support_bi
ts ).

ENDIF.

" when everything is updated, set sess


ion context

10
CHA
NGING support_bits = ls_context-support_bi
ts ).

ENDIF.
IF sb_nwbc_native_sapgui IS SUPPLIED.

cl_lsapi_manager=>set_supported( EXP
ORTING feature = if_lsapi=>mc_feature_nwbc
_native_sapgui

set = sb_nwbc_native_sapgui

CHA
NGING support_bits = ls_context-support_bi
ts ).

ENDIF.

" when everything is updated, set sess


ion context

39
3
context_set( is_context = ls_context )
.
ELSE.

1
RAISE already_initialized.

1
ev_already_initialized = abap_true.

LIMU
METH
CL_NWBC READ_QUERY_P
ARAMETER
00006

LIMU
METH
CL_NWBC READ_QUERY_P
ARAMETER
00000

3
1
\\\\\no_empty_blocks/////
1
\\\\\comments_not_ignored/////
1
\\\\\delta_normalized/////
1
0
2
5
4
METHOD read_query_parameter.
DATA: lv_query TYPE string,

lv_subrc LIKE sy-subrc,

2
lv_params TYPE string,

lt_fields TYPE tihttpnvp.

1
lt_fields TYPE tihttpnvp.

36
4
DELETE TABLE lt_fields WITH TABLE KE
Y name = iv_name.

ENDIF.
ENDIF.

3
IF cv_get IS SUPPLIED.

cv_get = cl_nwbc_utility=>fields_to_st
ring( lt_fields ).

ELSEIF cv_url IS SUPPLIED.

2
cv_get = cl_nwbc_utility=>fields_to_stri
ng( lt_fields ).

IF cv_url IS SUPPLIED.

LIMU
METH
CL_NWBC REPLACE_QUER
Y_PARAMETER
00002

LIMU
METH
CL_NWBC REPLACE_QUER
Y_PARAMETER
00000

3
1
\\\\\no_empty_blocks/////
1
\\\\\comments_not_ignored/////
1
\\\\\delta_normalized/////
1
0
1
28
3
<ff>-value = param_value.

ENDIF.

1
lv_params = cl_nwbc_utility=>fields_to_s
tring( lt_fields ).

6
IF param_default IS SUPPLIED AND param_v
alue EQ param_default.
DELETE TABLE post_body WITH TABLE KEY
name = param_name.

DELETE TABLE lt_fields WITH TABLE KEY


name = param_name.

ENDIF.

lv_params = cl_nwbc_utility=>fields_to_s
tring( lt_fields ).

LIMU
METH
CL_NWBC_HTML_BASE INITIALIZE

00002

LIMU
METH
CL_NWBC_HTML_BASE INITIALIZE

00000

3
1
\\\\\no_empty_blocks/////
1
\\\\\comments_not_ignored/////
1
\\\\\delta_normalized/////
1
0
1
14
4
cl_nwbc=>initialize_client(

exporting

version = lv_client_ve
rsion

sb_nwbc_obn = abap_true

3
sb_nwbc_navigate = abap_true

exceptions

already_initialized = 1 ).

1
sb_nwbc_navigate = abap_true ).
LIMU
METH
CL_NWBC_HTTP HANDLE_LAUNC
H
00008

LIMU
METH
CL_NWBC_HTTP HANDLE_LAUNC
H
00000

3
1
\\\\\no_empty_blocks/////
1
\\\\\comments_not_ignored/////
1
\\\\\delta_normalized/////
1
0
1
83
5
DATA:

lv_url_start TYPE string,

lv_url_end TYPE string.

SPLIT nwbc_url AT '?' INTO lv_url_star


t lv_url_end.

LOOP AT <cockpit_with_roles>-role_name
s ASSIGNING <role_name>.

2
DATA: agr_name_url TYPE string,

agr_name_url2 TYPE string.

1
DATA: agr_name_url TYPE string.

LIMU
METH
CL_NWBC_HTTP HANDLE_SAPGU
ILINK
99997

LIMU
METH
CL_NWBC_HTTP HANDLE_SAPGU
ILINK
00000

3
1
\\\\\no_empty_blocks/////
1
\\\\\comments_not_ignored/////
1
\\\\\delta_normalized/////
1
0
1
1
0
0
107
METHOD handle_sapguilink.
DATA: lv_p_transaction TYPE tcode,

lv_p_parameters TYPE string,

lv_p_destination TYPE rfcdest


,

lv_p_user TYPE string,

lt_p_parameters TYPE tihttpn


vp,

lv_p_skip_sel_screen TYPE abap_bo


ol,

lv_p_title TYPE string,


lv_p_language TYPE syst-la
ngu,

lv_p_report TYPE program


m,

lv_p_report_var TYPE raldb_v


ari,

lv_p_app_server TYPE rfcdisp


lay-rfchost,

lv_p_sys_number TYPE rfcdisp


lay-rfcservice,

lv_p_sys_id TYPE sy-sysi


d,

lv_p_client TYPE syst-ma


ndt,

lv_user LIKE sy-unam


e,

lv_xuser TYPE xstring


,
lr_conv TYPE REF TO
cl_abap_conv_in_ce,

lo_shortcut TYPE REF TO


cl_nwbc_sapgui_shortcut,

lv_shortcut TYPE string,

lv_shortcut_x TYPE xstring


,

lt_shortcut TYPE string_


table.

lv_p_transaction = mo_server_assist
->get_filtered_form_field( name = cl_nwbc_
sapgui_shortcut=>gc_s_url_param-transactio
n upper = abap_true ).

lv_p_destination = mo_server_assist
->get_filtered_form_field( name = cl_nwbc_
sapgui_shortcut=>gc_s_url_param-destinatio
n ).
lv_p_user = mo_server_assist
->get_filtered_form_field( name = cl_nwbc_
sapgui_shortcut=>gc_s_url_param-user ).

lv_p_client = mo_server_assist
->get_filtered_form_field( name = cl_nwbc_
sapgui_shortcut=>gc_s_url_param-client upp
er = abap_true default = sy-mandt ).

lv_p_title = mo_server_assist
->get_filtered_form_field( name = cl_nwbc_
sapgui_shortcut=>gc_s_url_param-title ).

lv_p_language = mo_server_assist
->get_filtered_form_field( name = cl_nwbc_
sapgui_shortcut=>gc_s_url_param-language u
pper = abap_true ).

lv_p_report = mo_server_assist
->get_filtered_form_field( name = cl_nwbc_
sapgui_shortcut=>gc_s_url_param-report upp
er = abap_true ).

lv_p_report_var = mo_server_assist
->get_filtered_form_field( name = cl_nwbc_
sapgui_shortcut=>gc_s_url_param-report_var
upper = abap_true ).

lv_p_app_server = mo_server_assist
->get_filtered_form_field( name = cl_nwbc_
sapgui_shortcut=>gc_s_url_param-app_server
).

lv_p_sys_number = mo_server_assist
->get_filtered_form_field( name = cl_nwbc_
sapgui_shortcut=>gc_s_url_param-sys_number
).

lv_p_sys_id = mo_server_assist
->get_filtered_form_field( name = cl_nwbc_
sapgui_shortcut=>gc_s_url_param-system_id
default = sy-sysid ).

lv_p_skip_sel_screen = mo_server_assist
->get_bool_form_field( name = cl_nwbc_sapg
ui_shortcut=>gc_s_url_param-skip_sel_scree
n ).

lv_p_parameters = mo_server_assist->ge
t_filtered_form_field( name = cl_nwbc_sapg
ui_shortcut=>gc_s_url_param-parameters ).

cl_nwbc_utility=>string_to_fields( EXPOR
TING iv_string = lv_p_parameters IMPORTING
et_fields = lt_p_parameters ).

lv_user = sy-uname.

IF lv_p_user IS NOT INITIAL.


" Decode User

CALL FUNCTION 'SCMS_BASE64_DECODE_STR'

EXPORTING

input = lv_p_user

IMPORTING

output = lv_xuser

EXCEPTIONS

failed = 1
OTHERS = 2.

IF sy-subrc IS INITIAL.

lr_conv = cl_abap_conv_in_ce=>create
( input = lv_xuser ).

lr_conv->read( IMPORTING data = lv_u


ser ).

ENDIF.

ENDIF.
IF lt_p_parameters IS NOT INITIAL.

lv_p_skip_sel_screen = abap_true.

ENDIF.

CREATE OBJECT lo_shortcut

EXPORTING

iv_transaction_code = lv_p_tr
ansaction

it_parameters = lt_p_pa
rameters
iv_user_id = lv_user

iv_title = lv_p_ti
tle

iv_client_id = lv_p_cl
ient

iv_language = lv_p_la
nguage

iv_report_name = lv_p_re
port

iv_report_variant = lv_p_re
port_var

iv_system_id = lv_p_sy
s_id

iv_application_server_name = lv_p_ap
p_server

iv_system_number = lv_p_sy
s_number
iv_skip_initial_screen = lv_p_sk
ip_sel_screen

iv_sm59_destination = lv_p_de
stination.

lo_shortcut->get_shortcut( IMPORTING et_


shortcut = lt_shortcut ).

CONCATENATE LINES OF lt_shortcut INTO lv


_shortcut SEPARATED BY crlf.

TRY.
CALL METHOD ('CL_ABAP_CODEPAGE')=>co
nvert_to

EXPORTING

SOURCE = lv_shortcut " So


urce String

codepage = 'ISO-8859-1' " Co


de Page Name

ignore_cerr = abap_true " Ig


nore Conversion Errors

RECEIVING

result = lv_shortcut_x.

CATCH cx_sy_dyn_call_error.

CALL METHOD lcl_abap_codepage=>conve


rt_to
EXPORTING

SOURCE = lv_shortcut " So


urce String

codepage = 'ISO-8859-1' " Co


de Page Name

ignore_cerr = abap_true " Ig


nore Conversion Errors

RECEIVING

result = lv_shortcut_x.

ENDTRY.
* Render HTTP response

mo_server_assist->set_response( iv_conte
nt = lv_shortcut_x iv_content_type = if_nw
bc_constants=>gc_s_file_type-sapshortcut )
.

ENDMETHOD.

LIMU
METH
CL_NWBC_RUNTIME35 CHECK_NAVIGA
TION_TREE_CACHE
00002

LIMU
METH
CL_NWBC_RUNTIME35 CHECK_NAVIGA
TION_TREE_CACHE
00000

3
1
\\\\\no_empty_blocks/////
1
\\\\\comments_not_ignored/////
1
\\\\\delta_normalized/////
1
0
1
9
3
CHECK menu_type NE if_nwbc_constants=>
gc_s_menu_type-favorites.
lv_version = me->if_nwbc_runtime~get_r
untime_version( ).

ev_is_nav_tree_cache_valid = abap_true
.

2
ev_dont_cache = abap_false.

LIMU
METH
CL_NWBC_RUNTIME35 CHECK_SAP_ME
NU_CACHE
00002

LIMU
METH
CL_NWBC_RUNTIME35 CHECK_SAP_ME
NU_CACHE
00000

3
1
\\\\\no_empty_blocks/////
1
\\\\\comments_not_ignored/////
1
\\\\\delta_normalized/////
1
0
1
8
6
DATA: lt_navigation_tree TYPE if_nwbc_
runtime35=>t_navigation_tree,

ls_nwbc_nav_tree TYPE nwbc_nav_t


ree,

ls_sap_menu_info TYPE t_sap_menu


_info,

ls_user_info TYPE if_nwbc_runtim


e35=>t_user_info

* Check SAP Menu

1
ls_sap_menu_info = me->get_sap_menu_in
fo( ).

2
ev_cache_exist = abap_false.
ls_sap_menu_info = me->get_sap_menu_in
fo( ).

LIMU
METH
CL_NWBC_RUNTIME35 GET_ENTERPRI
SE_SEARCH_ENTRIES
00002

LIMU
METH
CL_NWBC_RUNTIME35 GET_ENTERPRI
SE_SEARCH_ENTRIES
00000

3
1
\\\\\no_empty_blocks/////
1
\\\\\comments_not_ignored/////
1
\\\\\delta_normalized/////
1
0
3
2
1
METHOD get_enterprise_search_entries.

1
* IMPORTANT: This code only NW7.02+ and NW
7.20+

2
* IMPORTANT: This code only NW7.02+ and NW
7.20+

67
3
ENDLOOP.

CATCH cx_root INTO exception.


"#EC NO_HANDLER

ENDTRY.

1
* move "All Content" to the front

* move "All Content" to the front

72
3
READ TABLE rt_enterprise_search_en
tries INTO search_entry INDEX all_content.

DELETE rt_enterprise_search_entrie
s INDEX all_content.

INSERT search_entry INTO rt_enterp


rise_search_entries INDEX 1.

3
ENDIF.

ENDIF.

14
ENDIF.

" based on last request from ES colleg


es, they do nto want to see different ES c
ategories in the NWBC
" but want to have only one entry, cor
responding to ALL_CONTENT category

" but we do not know, if they will not


decide to change their mind soon, so we g
o defensive approach

" and leave the logic for category col


lection in place, but only leave one singl
e category in the list

" if exist. In most cases it will be A


LL_CONTENT category

READ TABLE rt_enterprise_search_entrie


s INDEX 1 INTO search_entry.

IF sy-subrc IS INITIAL.

CLEAR rt_enterprise_search_entries.

APPEND search_entry TO rt_enterprise


_search_entries.
ENDIF.

ENDIF.

LIMU
METH
CL_NWBC_RUNTIME35 IF_NWBC_RUNT
IME35~GET_ASSOCIATED_APPS
00006

LIMU
METH
CL_NWBC_RUNTIME35 IF_NWBC_RUNT
IME35~GET_ASSOCIATED_APPS
00000

3
1
\\\\\no_empty_blocks/////
1
\\\\\comments_not_ignored/////
1
\\\\\delta_normalized/////
1
0
1
55
6
DELETE ADJACENT DUPLICATES FROM lt_sps.
" OK, there are no duplicated SPs, but e
ven if they different, clients are not abl
e to display

" SPs with same texts, so we need to als


o delete side panels based on text equity

lt_nav_tree_srt = lt_nav_tree.

1
LOOP AT lt_nav_tree ASSIGNING <entry>.

1
LOOP AT lt_nav_tree_srt ASSIGNING <entry
>.

LIMU
METH
CL_NWBC_RUNTIME35 IF_NWBC_RUNT
IME35~GET_ASSOCIATED_LINKS
00006

LIMU
METH
CL_NWBC_RUNTIME35 IF_NWBC_RUNT
IME35~GET_ASSOCIATED_LINKS
00000

3
1
\\\\\no_empty_blocks/////
1
\\\\\comments_not_ignored/////
1
\\\\\delta_normalized/////
1
0
2
7
4
DATA: lt_nav_tree TYPE if_nwbc_run
time=>t_navigation_tree,

lt_nav_tree_srt TYPE if_nwbc_run


time=>t_navigation_tree_srt,

lt_tree_nodes TYPE if_nwbc_run


time=>t_navigation_tree,

lt_nodes LIKE et_node_ids


,

2
lt_texts TYPE string_tabl
e,

lt_links LIKE et_node_ids


,

1
lt_links LIKE et_node_ids
,

55
6
DELETE ADJACENT DUPLICATES FROM lt_links
.

" OK, there are no duplicated SPs, but e


ven if they different, clients are not abl
e to display

" SPs with same texts, so we need to als


o delete side panels based on text equity

lt_nav_tree_srt = lt_nav_tree.

1
LOOP AT lt_nav_tree ASSIGNING <entry>.

1
LOOP AT lt_nav_tree_srt ASSIGNING <entry
>.

LIMU
METH
CL_NWBC_RUNTIME35 IF_NWBC_RUNT
IME35~GET_ASSOCIATED_SEARCHES
00006

LIMU
METH
CL_NWBC_RUNTIME35 IF_NWBC_RUNT
IME35~GET_ASSOCIATED_SEARCHES
00000

3
1
\\\\\no_empty_blocks/////
1
\\\\\comments_not_ignored/////
1
\\\\\delta_normalized/////
1
0
1
62
6
DELETE ADJACENT DUPLICATES FROM lt_searc
hes.

" OK, there are no duplicated SPs, but e


ven if they different, clients are not abl
e to display

" SPs with same texts, so we need to als


o delete side panels based on text equity
lt_nav_tree_srt = lt_nav_tree.

1
LOOP AT lt_nav_tree ASSIGNING <entry>.

1
LOOP AT lt_nav_tree_srt ASSIGNING <entry
>.

LIMU
METH
CL_NWBC_RUNTIME35 IF_NWBC_RUNT
IME35~INVALIDATE_NAV_TREE_CACHE
00002

LIMU
METH
CL_NWBC_RUNTIME35 IF_NWBC_RUNT
IME35~INVALIDATE_NAV_TREE_CACHE
00000

3
1
\\\\\no_empty_blocks/////
1
\\\\\comments_not_ignored/////
1
\\\\\delta_normalized/////
1
0
2
2
1
METHOD if_nwbc_runtime35~invalidate_nav_
tree_cache.

1
DELETE FROM DATABASE nwbc_nav_tree(nt)
ID me->cache_id."Navigation Tree Data

DATA: lv_cache_counter TYPE i,

lv_cache_counter_string TYPE strin


g.

IF iv_all_users EQ abap_true.

DELETE FROM nwbc_nav_tree.


"#EC CI_NOWHERE

IMPORT cache_counter = lv_cache_counte


r_string FROM DATABASE indx(^c) ID c_nwbc_
cache_counter_id.

ELSE.

DELETE FROM DATABASE nwbc_nav_tree(nt)


ID me->cache_id."Navigation Tree Data

7
3
DELETE FROM DATABASE nwbc_nav_tree(ob)
ID me->cache_id."OBN Data

DELETE FROM DATABASE nwbc_nav_tree(bo)


ID me->cache_id."OBN Raw data (agr_hier_b
or)

DELETE FROM DATABASE nwbc_nav_tree(sc)


ID me->cache_id."Session Cache

5
CLEAR: me->cached_navigation_tree.

CLEAR: me->cached_obn_targets.

CLEAR: me->cached_user_menu.
cl_nwbc_logger=>add_message( runtime =
me no = 031 v1 = me->cache_id-extended_ke
y ).

22
IMPORT cache_counter = lv_cache_counte
r_string FROM DATABASE indx(^c) ID me->cac
he_id.

ENDIF.

CLEAR: me->cached_navigation_tree.

CLEAR: me->cached_obn_targets.

CLEAR: me->cached_user_menu.
lv_cache_counter = lv_cache_counter_stri
ng.

ADD 1 TO lv_cache_counter.

lv_cache_counter_string = lv_cache_count
er.

CONDENSE lv_cache_counter_string.

" record cache invalidation, to update o


ur role keys later

IF iv_all_users EQ abap_true.

EXPORT cache_counter = lv_cache_counte


r_string TO DATABASE indx(^c) ID c_nwbc_ca
che_counter_id.
ELSE.

EXPORT cache_counter = lv_cache_counte


r_string TO DATABASE indx(^c) ID me->cache
_id.

ENDIF.

IF iv_log EQ abap_true.

cl_nwbc_logger=>add_message( runtime =
me no = 031 v1 = me->cache_id-extended_ke
y ).

ENDIF.

LIMU
METH
CL_NWBC_RUNTIME35 IF_NWBC_RUNT
IME~EPCM_DO_NAVIGATE
00008
LIMU
METH
CL_NWBC_RUNTIME35 IF_NWBC_RUNT
IME~EPCM_DO_NAVIGATE
00000

3
1
\\\\\no_empty_blocks/////
1
\\\\\comments_not_ignored/////
1
\\\\\delta_normalized/////
1
0
2
4
3
METHOD if_nwbc_runtime~epcm_do_navigate.

CONSTANTS: lc_is_suspend_scenario TYPE s


tring VALUE `sap-nwbc-is_suspend_scenario`
, "#EC NOTEXT

3
lc_force_local_system TYPE s
tring VALUE `sap-nwbc-force_local_system`,
"#EC NOTEXT

lc_crystal_report TYPE s
tring VALUE `CrystalReport`, "#EC NOTEXT

lc_hook_url TYPE s
tring VALUE `HOOK_URL`, "#EC NOTEXT
1
lc_hook_url TYPE s
tring VALUE `HOOK_URL`, "#EC NOTEXT

32
3
query TYPE string,

lv_subrc TYPE sysubrc


.

2
FIELD-SYMBOLS: <ff> LIKE LINE OF post_b
ody,

<ff2> LIKE LINE OF post_b


ody.

1
FIELD-SYMBOLS: <ff> LIKE LINE OF post_b
ody.

LIMU
METH
CL_NWBC_RUNTIME35 IF_NWBC_RUNT
IME~GET_USER_INFO
00009

LIMU
METH
CL_NWBC_RUNTIME35 IF_NWBC_RUNT
IME~GET_USER_INFO
00000

3
1
\\\\\no_empty_blocks/////
1
\\\\\comments_ignored/////
1
\\\\\delta_normalized/////
1
0
8
186
3
theme = server->request->get_form_
field( if_http_form_fields_sap=>sap_theme
).

IF theme IS NOT INITIAL.

" check that theme name is valid

1
IF theme CA `#^&?%"'<>=+`. "#E
C NOTEXT

1
IF theme CA `#^&?%"'<>=+`. "#E
C STRING_OK
208
5
DATA: roles TYPE if_nwbc_runtim
e35=>t_roles,

ts LIKE me->cached_use
r_info-roles_timestamp,

role_list TYPE string,

role_hash TYPE hash160.

1
FIELD-SYMBOLS: <role> LIKE LINE OF r
oles.

4
DATA: lv_global_cache_counter_string T
YPE string,

lv_my_cache_counter_string T
YPE string.
FIELD-SYMBOLS: <role> LIKE LINE OF r
oles.

213
4

" unfortunaelly we need to store sessi


on context, for which we have generated ou
r keys,

" to be able to update our cache, in c


ase of sesion context is changed (initiali
zed)

me->cached_user_info-session_context =
ls_context-default_context.

roles = me->if_nwbc_runtime~get_role
s( ).
5

IMPORT cache_counter = lv_global_cache


_counter_string FROM DATABASE indx(^c) ID
c_nwbc_cache_counter_id.

IMPORT cache_counter = lv_my_cache_cou


nter_string FROM DATABASE indx(^c) ID me->
cache_id.

roles = me->if_nwbc_runtime~get_role
s( ).

241
7
CONCATENATE `r-` sy-saprl

`--u-` sy-uname

`--rh- ` role_hash
`--l-` me->cached_use
r_info-language

`--a-` me->cached_use
r_info-accessibility

`--tn-` me->cached_use
r_info-show_transaction_codes

`--cd-` cache_discrimi
nator

1
`--rtl-` me->runtime_lo
ad

3
`--gcd-` lv_global_cache_
counter_string

`--mcd-` lv_my_cache_coun
ter_string

`--rtl-` me->runtime_lo
ad

251
6
CONDENSE me->cached_user_info-roles_
key NO-GAPS.

"Favorites *************************
******************************************
*******

"timestamp

DATA: lv_fav_change_date TYPE dats,

2
lv_fav_change_time TYPE tims,

lv_version TYPE string


.

1
lv_fav_change_time TYPE tims.
265
3
IF sy-subrc EQ 0.

CONVERT DATE lv_fav_change_date TI


ME lv_fav_change_time INTO TIME STAMP me->
cached_user_info-favorites_timestamp TIME
ZONE sy-zonlo.

ENDIF.

lv_version = me->if_nwbc_runtime~get
_runtime_version( ).

"favorites key

2
"favorites key

275
6
CONCATENATE `r-` sy-saprl

`--u-` sy-uname

`--l-` me->cached_use
r_info-language

`--a-` me->cached_use
r_info-accessibility

`--tn-` me->cached_use
r_info-show_transaction_codes

`--cd-` cache_discrimi
nator

1
`--rtl-` me->runtime_lo
ad
3
`--gcd-` lv_global_cache_
counter_string

`--mcd-` lv_my_cache_coun
ter_string

`--rtl-` me->runtime_lo
ad

301
6
CONCATENATE `r-` sy-saprl

`--rh- ` me->cached_use
r_info-sap_menu_name

`--l-` me->cached_use
r_info-language

`--a-` me->cached_use
r_info-accessibility

`--tn-` me->cached_use
r_info-show_transaction_codes
`--cd-` cache_discrimi
nator

1
`--rtl-` me->runtime_lo
ad

3
`--gcd-` lv_global_cache_
counter_string

`--mcd-` lv_my_cache_coun
ter_string

`--rtl-` me->runtime_lo
ad

LIMU
METH
CL_NWBC_RUNTIME35 IF_NWBC_RUNT
IME~HANDLE_API
00006

LIMU
METH
CL_NWBC_RUNTIME35 IF_NWBC_RUNT
IME~HANDLE_API
00000

3
1
\\\\\no_empty_blocks/////
1
\\\\\comments_not_ignored/////
1
\\\\\delta_normalized/////
1
0
3
147
3
ELSE.

lv_version = io_server_assist->g
et_filtered_form_field( name = 'nwbc_runti
me_version' accept = '0-9.' ). "#EC NOTEXT

lv_sb = io_server_assist->g
et_filtered_form_field( name = 'sap-nwbc-s
upportbits' accept = '0-9A-F' ). "#EC NOTE
XT

1
cl_nwbc=>initialize_client( vers
ion = lv_version support_bits = lv_sb ).

1
cl_nwbc=>initialize_client( vers
ion = lv_version support_bits = lv_sb nwbc
_shell = nwbc_shell ).

201
3

lv_version = io_server_assist->get
_filtered_form_field( name = 'nwbc_runtime
_version' accept = '0-9.' ). "#EC NOTEXT
lv_sb = io_server_assist->get
_filtered_form_field( name = 'sap-nwbc-sup
portbits' accept = '0-9A-F' ). "#EC NOTEXT

3
cl_nwbc=>initialize_client( EXPORT
ING version = lv_version support_bits = lv
_sb EXCEPTIONS already_initialized = 1 ).

CLEAR cached_user_info.

IF sy-subrc IS NOT INITIAL. ENDIF.


"#EC NEEDED

2
cl_nwbc=>initialize_client( EXPORT
ING version = lv_version support_bits = lv
_sb nwbc_shell = nwbc_shell ).

CLEAR cached_user_info.

442
5
io_server_assist->set_response(

iv_content = xml
iv_content_type = if_nwbc_consta
nts=>gc_s_file_type-xml ).

WHEN 'INVALIDATE_NAVIGATION_TREE_BUF
FER' OR 'INVALIDATENAVIGATIONTREEBUFFER'.

1
if_nwbc_runtime35~invalidate_nav_t
ree_cache( ).

1
if_nwbc_runtime35~invalidate_nav_t
ree_cache( iv_log = abap_false ).

LIMU
METH
CL_NWBC_RUNTIME35 IF_NWBC_RUNT
IME~RESOLVE_NAVIGATION
00006

LIMU
METH
CL_NWBC_RUNTIME35 IF_NWBC_RUNT
IME~RESOLVE_NAVIGATION
00000

3
1
\\\\\no_empty_blocks/////
1
\\\\\comments_not_ignored/////
1
\\\\\delta_normalized/////
1
0
1
395
3
DATA: ls_navigation_entry LIKE navig
ation_entry.

ls_navigation_entry = navigation_ent
ry.

ls_navigation_entry-target_system =
sm59_alias.

1
cl_nwbc=>read_query_parameter( EXPOR
TING iv_name = 'orig_url' CHANGING cv_url
= url rv_value = ls_navigation_entry-url
).

1
cl_nwbc=>read_query_parameter( EXPORTI
NG iv_name = 'orig_url' CHANGING cv_url =
url rv_value = ls_navigation_entry-url ).
"#EC NOTEXT

LIMU
METH
CL_NWBC_RUNTIME35 RESOLVE_LPD_
CRE
00002

LIMU
METH
CL_NWBC_RUNTIME35 RESOLVE_LPD_
CRE
00000
3
1
\\\\\no_empty_blocks/////
1
\\\\\comments_not_ignored/////
1
\\\\\delta_normalized/////
1
0
2
3
2
METHOD resolve_lpd_cre.

2
CONSTANTS: lc_force_local_system TYPE
string VALUE `sap-nwbc-force_local_system
`,

lc_crystal_report TYPE
string VALUE `CrystalReport`.

2
CONSTANTS: lc_force_local_system TYPE
string VALUE `sap-nwbc-force_local_system
`, "#EC NOTEXT

lc_crystal_report TYPE
string VALUE `CrystalReport`. "#EC NOTEXT

76
3
ENDIF.
" Crystal Reports do now like sap-clie
nt they WANT sap_client! CSN 2334674 2011

1
REPLACE ALL OCCURRENCES OF if_http_for
m_fields_sap=>sap_client IN ev_url WITH `s
ap_client`.

1
REPLACE ALL OCCURRENCES OF if_http_for
m_fields_sap=>sap_client IN ev_url WITH `s
ap_client`. "#EC NOTEXT

LIMU
METH
CL_NWBC_RUNTIME35 RESOLVE_URL

00004

LIMU
METH
CL_NWBC_RUNTIME35 RESOLVE_URL

00000

3
1
\\\\\no_empty_blocks/////
1
\\\\\comments_not_ignored/////
1
\\\\\delta_normalized/////
1
0
5
13
6
DATA: lv_length TYPE i,

lv_query TYPE string,

lv_params TYPE string,

lv_obn_system TYPE string,

lv_obn_object TYPE string,

lv_obn_operation TYPE string,

1
lt_fields LIKE query_par
ms,

2
lo_lsapi TYPE REF TO if_l
sapi,
lt_fields LIKE query_par
ms,

18
4
in_parms LIKE query_par
ms.

FIELD-SYMBOLS: <ff> LIKE LINE OF que


ry_parms.

1
IF target CS `OBN://` AND sy-fdpos EQ
0.

3
lo_lsapi = cl_lsapi_manager=>get_instanc
e( ).
IF target CS `OBN://` AND sy-fdpos EQ
0.

155
4
ELSEIF target CS if_lsapi=>gc_s_protocol
-transaction AND sy-fdpos EQ 0.

* Example

* ls-tr://YI3100~SE80?USR02-BNAME=XYZ

3
DATA: lv_sm59_alias TYPE string,

lv_dynp_okcode TYPE string,

lv_transaction TYPE string.


5
DATA: lv_sm59_alias TYPE rfcdest,

lv_dynp_okcode TYPE string,

lv_native_sapgui TYPE abap_bool


,

lv_force_sapgui TYPE string,

lv_transaction TYPE tcode.

172
3
IF lv_transaction IS INITIAL.

RAISE not_resolved.

ENDIF.

3
report_type = if_nwbc_runtime~e_report
_type-transaction.

13

lv_native_sapgui = lo_lsapi->is_suppor
ted( feature = if_lsapi=>mc_feature_nwbc_n
ative_sapgui ).

cl_nwbc=>read_query_parameter( EXPORTI
NG iv_name = if_lsapi=>mc_tr_force_sapgui
iv_delete = abap_true

CHANGIN
G cv_get = lv_params ct_post = query_par
ms rv_value = lv_force_sapgui ).
IF lv_force_sapgui EQ abap_true AND lv
_native_sapgui EQ abap_false.

report_type = if_nwbc_runtime~e_repo
rt_type-url.

cl_nwbc_utility=>string_to_fields( E
XPORTING iv_string = lv_params IMPORTING e
t_fields = lt_fields ).

APPEND LINES OF query_parms TO lt_fi


elds.

url = cl_nwbc_sapgui_shortcut=>url(
iv_transaction_code = lv_transaction iv_sm
59_destination = lv_sm59_alias it_paramete
rs = lt_fields ).

ELSE.

report_type = if_nwbc_runtime~e_repo
rt_type-transaction.

179
4
cl_nwbc=>read_query_parameter( EXPORTI
NG iv_name = cl_url=>mc_its_dynp_okcode iv
_delete = abap_true
CHANGIN
G cv_get = lv_params ct_post = query_par
ms rv_value = lv_dynp_okcode ).

url = me->url->its( sm59_alias = lv_sm


59_alias transaction = lv_transaction dynp
_okcode = lv_dynp_okcode query_parms = que
ry_parms query_string = lv_params ).

3
CLEAR query_parms. " no post body for
transactions

ELSEIF target CS `mailto:` AND sy-fdpo


s EQ 0.

4
ENDIF.

CLEAR query_parms. " no post body for


transactions
ELSEIF target CS `mailto:` AND sy-fdpos
EQ 0. "#EC NOTEXT

LIMU
METH
CL_NWBC_RUNTIME35 TREE_PROCESS
_APPL_ALIAS_GLOBAL
00006

LIMU
METH
CL_NWBC_RUNTIME35 TREE_PROCESS
_APPL_ALIAS_GLOBAL
00000

3
1
\\\\\no_empty_blocks/////
1
\\\\\comments_not_ignored/////
1
\\\\\delta_normalized/////
1
0
1
15
3
DATA: lv_name TYPE s
tring,

lv_clone_id TYPE s
tring,

lv_object_id TYPE s
tring,
2
lt_result_tab TYPE m
atch_result_tab,

lt_transactions_refs TYPE t
t_references,

1
lt_transactions_refs TYPE t
t_references,

LIMU
METH
CL_NWBC_SAPGUI_SHORTCUT ADD_HEADER

99997

LIMU
METH
CL_NWBC_SAPGUI_SHORTCUT ADD_HEADER

00000

3
1
\\\\\no_empty_blocks/////
1
\\\\\comments_not_ignored/////
1
\\\\\delta_normalized/////
1
0
1
1
0
0
7
METHOD add_header.
FIELD-SYMBOLS: <line> LIKE LINE OF data.

IF header IS NOT INITIAL.

APPEND INITIAL LINE TO data ASSIGNING


<line>.

CONCATENATE `[` header `]` INTO <line>


.

ENDIF.

ENDMETHOD.

LIMU
METH
CL_NWBC_SAPGUI_SHORTCUT ADD_OPTION

99997

LIMU
METH
CL_NWBC_SAPGUI_SHORTCUT ADD_OPTION

00000
3
1
\\\\\no_empty_blocks/////
1
\\\\\comments_not_ignored/////
1
\\\\\delta_normalized/////
1
0
1
1
0
0
7
METHOD add_option.

FIELD-SYMBOLS: <line> LIKE LINE OF data.

IF name IS NOT INITIAL AND value IS NOT


INITIAL.

APPEND INITIAL LINE TO data ASSIGNING


<line>.

CONCATENATE name `=` value INTO <line>


.

ENDIF.

ENDMETHOD.
LIMU
METH
CL_NWBC_SAPGUI_SHORTCUT ADD_URL_PARA
M
99997

LIMU
METH
CL_NWBC_SAPGUI_SHORTCUT ADD_URL_PARA
M
00000

3
1
\\\\\no_empty_blocks/////
1
\\\\\comments_not_ignored/////
1
\\\\\delta_normalized/////
1
0
1
1
0
0
11
METHOD add_url_param.

FIELD-SYMBOLS: <ff> LIKE LINE OF fields.


IF name IS NOT INITIAL AND value NE defa
ult.

APPEND INITIAL LINE TO fields ASSIGNIN


G <ff>.

<ff>-name = name.

<ff>-value = value.

ENDIF.

ENDMETHOD.

LIMU
METH
CL_NWBC_SAPGUI_SHORTCUT CONSTRUCTOR

99997

LIMU
METH
CL_NWBC_SAPGUI_SHORTCUT CONSTRUCTOR

00000

3
1
\\\\\no_empty_blocks/////
1
\\\\\comments_not_ignored/////
1
\\\\\delta_normalized/////
1
0
1
1
0
0
204
METHOD constructor.

" SYSTEM

mv_system_id = iv_system
_id.

mv_client_id = iv_client
_id.

mv_system_description = iv_system
_description.
mv_application_server_name = iv_applic
ation_server_name.

mv_system_number = iv_system
_number.

mt_gateway_hosts = it_gatewa
y_hosts.

mv_message_server_name = iv_messag
e_server_name.

mv_service_port = iv_servic
e_port.

mv_logon_group = iv_logon_
group.

" USER

mv_user_id = iv_user_i
d.

mv_password = iv_passwo
rd.

mv_language = iv_langua
ge.

" FUNCTION

mv_system_command = iv_system
_command.

mv_report_name = iv_report
_name.

mv_report_variant = iv_report
_variant.

mv_transaction_code = iv_transa
ction_code.
mv_skip_initial_screen = iv_skip_i
nitial_screen.

mt_parameters = it_parame
ters.

mv_title = iv_title.

" OPTIONS

mv_trace_level = iv_trace_
level.

mv_work_directory = iv_work_d
irectory.

mv_gui_size = iv_gui_si
ze.

mv_reuse_existing_connection = iv_reuse_
existing_connection.
" now complete defaults

DATA: lv_usr_snc TYPE snc_pname,

lv_sys_snc TYPE pname_appl,

lv_sys_snc_qop TYPE snc_qop VALUE


'9',

ls_bapi_snc TYPE bapisncu,

lt_bapiret TYPE bapirettab,

lv_rfc_dest LIKE iv_sm59_destin


ation.
lv_rfc_dest = iv_sm59_destination.

" if nothing is provided, assume local s


ystem

IF lv_rfc_dest IS INITIAL AND iv_applica


tion_server_name IS INITIAL AND

iv_message_server_name IS INITIAL AND


iv_logon_group IS INITIAL.

lv_rfc_dest = sc_local_system.

ENDIF.
IF lv_rfc_dest EQ sc_local_system.

CALL FUNCTION 'CREATE_RFC_REENTRANCE_T


ICKET'

IMPORTING

ticket = mv_sso_co
okie

EXCEPTIONS

ticket_logon_disabled = 1

ticket_creation_failed = 2
OTHERS = 4.

IF sy-subrc IS NOT INITIAL OR mv_sso_c


ookie IS INITIAL.

CALL FUNCTION 'SNC_GET_MY_INFO'


"#EC *

IMPORTING

pname_appl = lv_sys_snc

snc_qop_max = lv_sys_snc_qop

pname_user = lv_usr_snc
EXCEPTIONS

internal_error = 1

snc_not_active = 2

OTHERS = 3.

IF lv_usr_snc IS INITIAL AND sy-subr


c NE 2.

CALL FUNCTION 'BAPI_USER_GET_DETAI


L'

EXPORTING
username = iv_user_id

IMPORTING

snc = ls_bapi_snc

TABLES

return = lt_bapiret.

lv_usr_snc = ls_bapi_snc-pname.
ENDIF.

ENDIF.

DATA: lv_system_text TYPE tmsmconf-sy


stxt,

lv_system_host TYPE tmscdes-rfc


host.

CALL FUNCTION 'TMS_CFG_GET_LOCAL_SYSTE


M_INFO'

IMPORTING
ev_system_text = lv_system_text

ev_system_host = lv_system_host

EXCEPTIONS

OTHERS.

IF sy-subrc IS INITIAL.

mv_system_description = lv_sys
tem_text.

mv_application_server_name = lv_sys
tem_host.
mv_system_number = get_sy
stem_number( lv_system_host(32) ).

ENDIF.

ELSEIF lv_rfc_dest IS NOT INITIAL.

DATA: dest TYPE cl_url=>t_single_sm59_


destination.

cl_url=>resolve_sm59_alias( EXPORTING
alias = lv_rfc_dest IMPORTING sm59_rfc_des
tination = dest ).

IF dest-name IS NOT INITIAL AND dest-r


c IS INITIAL.
lv_rfc_dest = dest-name.

ENDIF.

CALL FUNCTION 'SNC_GET_MY_INFO' DESTIN


ATION lv_rfc_dest "#EC *

IMPORTING

pname_appl = lv_sys_snc

snc_qop_max = lv_sys_snc_qop

pname_user = lv_usr_snc
EXCEPTIONS

internal_error = 1

snc_not_active = 2

OTHERS = 3.

IF lv_usr_snc IS INITIAL AND sy-subrc


NE 2.

CALL FUNCTION 'BAPI_USER_GET_DETAIL'


DESTINATION lv_rfc_dest

EXPORTING
username = iv_user_id

IMPORTING

snc = ls_bapi_snc

TABLES

return = lt_bapiret

EXCEPTIONS

OTHERS.

IF sy-subrc IS INITIAL.
lv_usr_snc = ls_bapi_snc-pname.

ENDIF.

ENDIF.

DATA: lv_loadbalancing TYPE rfcdisp


laz-rfclbflag.

DATA: lv_group TYPE rfcdisp


laz-rfcload.

DATA: lv_client TYPE rfcdisp


lay-rfcclient.
DATA: ls_rfc_system_info TYPE rfcsi.

CALL FUNCTION 'RFC_READ_R3_DESTINATION


'

EXPORTING

destination = lv_rfc_dest

authority_check = ''

bypass_buf = ''

IMPORTING

loadbalancing = lv_loadbalancing
systemid = mv_system_id

systemnr = mv_system_number

server = mv_application_s
erver_name

group = lv_group

client = lv_client

EXCEPTIONS

OTHERS.
IF sy-subrc IS INITIAL.

IF mv_system_id IS INITIAL.

DATA: lv_rfc_dest_s TYPE string.

CONSTANTS: lc_dummy_systemid TYPE


syst-sysid VALUE 'ZZZ'.

lv_rfc_dest_s = lv_rfc_dest.

CALL FUNCTION 'RFC_GET_SYSTEM_INFO


'
EXPORTING

destination = lv_r
fc_dest_s

IMPORTING

rfcsi_export = ls_r
fc_system_info

EXCEPTIONS

authority_not_available = 1

OTHERS = 2.
IF sy-subrc IS INITIAL AND ls_rfc_
system_info-rfcsysid IS NOT INITIAL.

mv_system_id = ls_rfc_system_inf
o-rfcsysid.

ELSE.

mv_system_id = lc_dummy_systemid
.

ENDIF.

ENDIF.

IF lv_client IS NOT INITIAL.

mv_client_id = lv_client.
ENDIF.

IF lv_group IS NOT INITIAL.

mv_logon_group = lv_group.

CONCATENATE '[' mv_logon_group ']'


INTO mv_system_description.

CONCATENATE mv_system_id mv_system


_description INTO mv_system_description SE
PARATED BY space.

ENDIF.

ENDIF.
ENDIF.

IF lv_usr_snc IS NOT INITIAL.

mv_snc_partner_name = lv_sys_snc.

mv_snc_quality_of_protection = lv_sys_
snc_qop.

ENDIF.
ENDMETHOD.

LIMU
METH
CL_NWBC_SAPGUI_SHORTCUT CREATE_TRANS
ACTION_STRING
99997

LIMU
METH
CL_NWBC_SAPGUI_SHORTCUT CREATE_TRANS
ACTION_STRING
00000

3
1
\\\\\no_empty_blocks/////
1
\\\\\comments_not_ignored/////
1
\\\\\delta_normalized/////
1
0
1
1
0
0
51
METHOD create_transaction_string.

DATA: len TYPE i,


lv_name TYPE string,

tr_parms TYPE string.

FIELD-SYMBOLS: <ff> LIKE LINE OF paramet


ers.

" it is not yet clear what control if fi


rst screen should be skept but probably th
is is like this:

" - for SLECTION SCREENs

" You need to add * symbol before tran


saction name (we do it always, if paramate
rs are passed)

" Examples (test in SAP GUI OKCODE fie


ld):
" /n*se16 DATABROWSE-TABLENAME=NWBC_
VC_GUI_TAG - skips selection screen

" /nse16 DATABROWSE-TABLENAME=NWBC_V


C_GUI_TAG - no skipping without * only
filling in of value into selection screen

" - for non SELECTION SCREEN (standard d


ynpro)

" use DYNP_OKCODE parameter instead wi


th corresponding OK code. Most likely DYNP
_OKCODE does work with selection screens a
lso.

" For more details ask Dynpro experts fr


om BC-ABA-SC

CHECK transaction_code IS NOT INITIAL.

rv = transaction_code.
LOOP AT parameters ASSIGNING <ff>.

len = strlen( <ff>-name ).

" try to collect transaction paramater


s to transaction field

CHECK len < 1 OR <ff>-name(1) NE `~`.


" skip ~nosplash, ~transaction etc paramet
ers

CHECK len < 4 OR <ff>-name(4) NS `sap-


`. " skip SAP technical parameters
lv_name = <ff>-name.

TRANSLATE lv_name TO UPPER CASE.

CONCATENATE tr_parms `;` lv_name `=` <


ff>-value INTO tr_parms. "#EC NOTEXT

ENDLOOP.

IF tr_parms IS NOT INITIAL.

" add "skip selection screen" flag for


web gui (make sence only if paramaters ar
e passed)

IF rv CN cl_url=>mc_par_its_skip_sel_s
creen AND skip_selection EQ abap_true.

CONCATENATE cl_url=>mc_par_its_skip_
sel_screen rv INTO rv.
ENDIF.

" add paramaters for transaction

IF rv CA ` `. " already parameters exi


st

CONCATENATE rv tr_parms INTO rv.


"~transaction=*XXX%20abc=123;klm=456

ELSE. " no parameters yet

CONCATENATE rv ` ` tr_parms+1 INTO r


v.

ENDIF.
ENDIF.

CONDENSE rv.

ENDMETHOD.

LIMU
METH
CL_NWBC_SAPGUI_SHORTCUT GET_COMMAND_
STRING
99997

LIMU
METH
CL_NWBC_SAPGUI_SHORTCUT GET_COMMAND_
STRING
00000

3
1
\\\\\no_empty_blocks/////
1
\\\\\comments_not_ignored/////
1
\\\\\delta_normalized/////
1
0
1
1
0
0
19
METHOD get_command_string.

* Create Command string

DATA: lv_command_part LIKE rv_command.

IF mv_transaction_code IS NOT INITIAL. "


Transaction

rv_command = create_transaction_string
( transaction_code = mv_transaction_code p
arameters = mt_parameters skip_selection =
mv_skip_initial_screen ).

ELSEIF mv_report_name IS NOT INITIAL. "


Report
IF mv_report_variant IS NOT INITIAL.

CONCATENATE mv_report_name space mv_


report_variant INTO lv_command_part RESPEC
TING BLANKS.

rv_command = surround( text = lv_com


mand_part ).

ELSE.

rv_command = surround( mv_report_nam


e ).

ENDIF.

ELSEIF mv_system_command IS NOT INITIAL.


" System Command

rv_command = surround( mv_system_comma


nd ).

ENDIF.
ENDMETHOD.

LIMU
METH
CL_NWBC_SAPGUI_SHORTCUT GET_COMMAND_
TYPE_STRING
99997

LIMU
METH
CL_NWBC_SAPGUI_SHORTCUT GET_COMMAND_
TYPE_STRING
00000

3
1
\\\\\no_empty_blocks/////
1
\\\\\comments_not_ignored/////
1
\\\\\delta_normalized/////
1
0
1
1
0
0
11
METHOD get_command_type_string.
IF mv_transaction_code IS NOT INITIAL.

rv_command_type = sc_command_type_tran
saction.

ELSEIF mv_report_name IS NOT INITIAL.

rv_command_type = sc_command_type_repo
rt.

ELSEIF mv_system_command IS NOT INITIAL.

rv_command_type = sc_command_type_syst
em_command.

ENDIF.

ENDMETHOD.
LIMU
METH
CL_NWBC_SAPGUI_SHORTCUT GET_GUI_PARA
M_STRING
99997

LIMU
METH
CL_NWBC_SAPGUI_SHORTCUT GET_GUI_PARA
M_STRING
00000

3
1
\\\\\no_empty_blocks/////
1
\\\\\comments_not_ignored/////
1
\\\\\delta_normalized/////
1
0
1
1
0
0
53
METHOD get_gui_param_string.

* Create GuiParm string

DATA: lv_service_port TYPE char20,


lv_snc_string TYPE string,

lv_snc_string2 TYPE string.

FIELD-SYMBOLS: <ls_gateway_host> LIKE LI


NE OF mt_gateway_hosts.

* append routers

LOOP AT mt_gateway_hosts ASSIGNING <ls_g


ateway_host>.

CONCATENATE rv_parameters `/H/` <ls_ga


teway_host>-router `/S/` <ls_gateway_host>
-routerservice INTO rv_parameters.
ENDLOOP.

IF mv_application_server_name IS NOT INI


TIAL.

* Set System by Application Server and


System Number

IF rv_parameters IS INI