Skip to content

Commit 23cc84a

Browse files
restore WS sample (#561)
Co-authored-by: oblomov-dev <[email protected]>
1 parent 9654b5e commit 23cc84a

File tree

6 files changed

+311
-19
lines changed

6 files changed

+311
-19
lines changed
Lines changed: 181 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,187 @@
1-
class Z2UI5_CL_DEMO_APP_S_05 definition
2-
public
3-
create public .
1+
CLASS z2ui5_cl_demo_app_s_05 DEFINITION PUBLIC.
2+
3+
PUBLIC SECTION.
4+
5+
TYPES:
6+
BEGIN OF t_news,
7+
text TYPE string,
8+
author TYPE string,
9+
END OF t_news,
10+
tt_News TYPE STANDARD TABLE OF t_news
11+
WITH NON-UNIQUE DEFAULT KEY.
12+
13+
INTERFACES z2ui5_if_app.
14+
DATA news_input TYPE string.
15+
DATA author_input TYPE string.
16+
DATA news_list TYPE tt_News.
17+
DATA connections TYPE int8.
18+
19+
PROTECTED SECTION.
20+
DATA client TYPE REF TO z2ui5_if_client.
21+
22+
METHODS z2ui5_on_event.
23+
METHODS z2ui5_on_render.
24+
METHODS z2ui5_display_popover.
25+
26+
PRIVATE SECTION.
427

5-
public section.
6-
protected section.
7-
private section.
828
ENDCLASS.
929

1030

31+
CLASS z2ui5_cl_demo_app_s_05 IMPLEMENTATION.
32+
33+
METHOD z2ui5_if_app~main.
34+
35+
me->client = client.
36+
37+
IF me->z2ui5_if_app~check_initialized = abap_false.
38+
connections = z2ui5_cl_demo_app_s_05_ws=>get_active_connections( ).
39+
ENDIF.
40+
41+
IF client->get( )-event IS NOT INITIAL.
42+
z2ui5_on_event( ).
43+
client->view_model_update( ).
44+
RETURN.
45+
ENDIF.
46+
47+
z2ui5_on_render( ).
48+
49+
ENDMETHOD.
50+
51+
52+
METHOD z2ui5_on_event.
53+
DATA: news TYPE t_news.
54+
55+
CASE client->get( )-event.
56+
WHEN `CLEAR`.
57+
58+
CLEAR: news_list.
59+
60+
WHEN 'BACK'.
61+
62+
client->nav_app_leave( client->get_app( client->get( )-s_draft-id_prev_app_stack ) ).
63+
64+
WHEN 'CLICK_HINT_ICON'.
65+
66+
z2ui5_display_popover( ).
67+
68+
ENDCASE.
69+
70+
ENDMETHOD.
71+
72+
73+
METHOD z2ui5_on_render.
74+
75+
DATA(view) = z2ui5_cl_xml_view=>factory( ).
76+
DATA(page) = view->shell(
77+
)->page(
78+
title = 'abap2UI5 - Sample: News Feed over WebSocket'
79+
navbuttonpress = client->_event( 'BACK' )
80+
shownavbutton = xsdbool( client->get( )-s_draft-id_prev_app_stack IS NOT INITIAL ) ).
81+
82+
page->header_content(
83+
)->button( id = `button_hint_id`
84+
icon = `sap-icon://hint`
85+
tooltip = `Sample information`
86+
press = client->_event( 'CLICK_HINT_ICON' ) ).
87+
88+
DATA(form) = page->simple_form( editable = abap_true
89+
title = `Publish news`
90+
class = `sapUiTinyMarginBottom`
91+
)->content( `form` ).
92+
93+
form->feed_input(
94+
value = client->_bind_edit( news_input )
95+
post = client->_event_client(
96+
val = `Z2UI5`
97+
t_arg = VALUE #( ( `feedInputPost` ) )
98+
) ).
99+
100+
form->label( text = `Author`
101+
)->input( value = client->_bind_edit( author_input )
102+
placeholder = `Anonymous` ).
103+
104+
page->list(
105+
headertext = `News`
106+
items = client->_bind_edit( news_list )
107+
)->feed_list_item(
108+
sender = `{AUTHOR}`
109+
text = `{TEXT}`
110+
showicon = abap_false ).
111+
112+
DATA(footer) = page->footer( )->overflow_toolbar( ).
113+
footer->info_label(
114+
text = client->_bind_edit( connections )
115+
colorscheme = `7`
116+
icon = `sap-icon://connected` ).
117+
118+
footer->toolbar_spacer( )->button(
119+
text = `Clear`
120+
icon = `sap-icon://clear-all`
121+
press = client->_event( `CLEAR` ) ).
122+
123+
IF me->z2ui5_if_app~check_initialized = abap_false.
124+
view->_generic( name = `script`
125+
ns = `html`
126+
)->_cc_plain_xml(
127+
`(()=>{ ` &&
128+
` const ws_url = (window.location.origin + '/sap/bc/apc/sap/z2ui5_sample').replace('http','ws');` &&
129+
` try { ` &&
130+
` ws = new WebSocket(ws_url);` &&
131+
` } catch (err) {` &&
132+
` alert(err);` &&
133+
` }` &&
134+
` ws.onopen = ()=>{};` &&
135+
` ws.onmessage = (msg)=>{` &&
136+
` const model = z2ui5.oController.oView.getModel();` &&
137+
` const data = model.getData();` &&
138+
` if (msg.data === '` && z2ui5_cl_demo_app_s_05_ws=>c_msg-__new_connection__ && `') {` &&
139+
` data.XX.CONNECTIONS += 1;` &&
140+
` } else if (msg.data === '` && z2ui5_cl_demo_app_s_05_ws=>c_msg-__closed__ && `') {` &&
141+
` data.XX.CONNECTIONS -= 1;` &&
142+
` } else {` &&
143+
` data.XX.NEWS_LIST.push(JSON.parse(msg.data));` &&
144+
` }` &&
145+
` model.setData(data);` &&
146+
` };` &&
147+
` ws.onclose = (msg)=>{};` &&
148+
`})()` ).
149+
150+
view->_generic( name = `script`
151+
ns = `html`
152+
)->_cc_plain_xml(
153+
`z2ui5.feedInputPost = () => { ` &&
154+
` const model = z2ui5.oView.getModel();` &&
155+
` const data = model.getData();` &&
156+
` ws.send(JSON.stringify({ ` &&
157+
` TEXT : data.XX.NEWS_INPUT,` &&
158+
` AUTHOR : data.XX.AUTHOR_INPUT ` &&
159+
` }));` &&
160+
` setTimeout( () => { ` &&
161+
` data.XX.NEWS_INPUT = "";` &&
162+
` model.setData(data);` &&
163+
` }, 10 ); ` &&
164+
`}` ).
165+
ENDIF.
166+
167+
client->view_display( view->stringify( ) ).
168+
169+
ENDMETHOD.
170+
171+
172+
METHOD z2ui5_display_popover.
173+
174+
DATA(view) = z2ui5_cl_xml_view=>factory_popup( ).
175+
view->quick_view( placement = `Bottom`
176+
width = `auto`
177+
)->quick_view_page( pageid = `sampleInformationId`
178+
header = `Sample information`
179+
description = `This sample show how to consume APC-Messages over websocket. Open the app mutliple times and post something.` ).
180+
181+
client->popover_display(
182+
xml = view->stringify( )
183+
by_id = `button_hint_id` ).
184+
185+
ENDMETHOD.
11186

12-
CLASS Z2UI5_CL_DEMO_APP_S_05 IMPLEMENTATION.
13187
ENDCLASS.
Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,16 @@
11
<?xml version="1.0" encoding="utf-8"?>
22
<abapGit version="v1.0.0" serializer="LCL_OBJECT_CLAS" serializer_version="v1.0.0">
3-
<asx:abap version="1.0" xmlns:asx="http://www.sap.com/abapxml"/>
3+
<asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
4+
<asx:values>
5+
<VSEOCLASS>
6+
<CLSNAME>Z2UI5_CL_DEMO_APP_S_05</CLSNAME>
7+
<LANGU>E</LANGU>
8+
<DESCRIPT>News Feed over Websocket</DESCRIPT>
9+
<STATE>1</STATE>
10+
<CLSCCINCL>X</CLSCCINCL>
11+
<FIXPT>X</FIXPT>
12+
<UNICODE>X</UNICODE>
13+
</VSEOCLASS>
14+
</asx:values>
15+
</asx:abap>
416
</abapGit>
Lines changed: 101 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,107 @@
1-
class Z2UI5_CL_DEMO_APP_S_05_WS definition
2-
public
3-
create public .
1+
CLASS z2ui5_cl_demo_app_s_05_ws DEFINITION PUBLIC
2+
INHERITING FROM cl_apc_wsp_ext_stateless_base.
3+
4+
PUBLIC SECTION.
5+
6+
CLASS-METHODS: get_active_connections
7+
RETURNING
8+
VALUE(result) TYPE i.
9+
10+
METHODS:
11+
if_apc_wsp_extension~on_message REDEFINITION,
12+
if_apc_wsp_extension~on_start REDEFINITION,
13+
if_apc_wsp_extension~on_close REDEFINITION.
14+
15+
CONSTANTS:
16+
c_amc_application_id TYPE amc_application_id VALUE 'Z2UI5_SAMPLE' ##NO_TEXT,
17+
c_channel_id TYPE amc_channel_id VALUE '/news_feed' ##NO_TEXT,
18+
BEGIN OF c_msg,
19+
__new_connection__ TYPE string VALUE `__NEW_CONNECTION__` ##NO_TEXT,
20+
__closed__ TYPE string VALUE `__CLOSED__` ##NO_TEXT,
21+
END OF c_msg.
22+
23+
PRIVATE SECTION.
24+
25+
CLASS-METHODS:
26+
get_producer
27+
RETURNING
28+
VALUE(producer) TYPE REF TO if_amc_message_producer_text
29+
RAISING
30+
cx_amc_error,
31+
send
32+
IMPORTING
33+
i_message TYPE string
34+
RAISING
35+
cx_amc_error.
436

5-
public section.
6-
protected section.
7-
private section.
837
ENDCLASS.
938

1039

40+
CLASS z2ui5_cl_demo_app_s_05_ws IMPLEMENTATION.
41+
42+
METHOD get_producer.
43+
44+
producer ?= cl_amc_channel_manager=>create_message_producer( i_application_id = c_amc_application_id
45+
i_channel_id = c_channel_id ).
46+
47+
ENDMETHOD.
48+
49+
50+
METHOD if_apc_wsp_extension~on_message.
51+
52+
TRY.
53+
send( i_message->get_text( ) ).
54+
CATCH cx_root INTO DATA(error).
55+
RAISE SHORTDUMP error.
56+
ENDTRY.
57+
58+
ENDMETHOD.
59+
60+
61+
METHOD if_apc_wsp_extension~on_start.
62+
63+
TRY.
64+
65+
i_context->get_binding_manager(
66+
)->bind_amc_message_consumer( i_application_id = c_amc_application_id
67+
i_channel_id = c_channel_id ).
68+
69+
get_producer( )->send( c_msg-__new_connection__ ).
70+
71+
CATCH cx_root INTO DATA(error).
72+
RAISE SHORTDUMP error.
73+
ENDTRY.
74+
75+
ENDMETHOD.
76+
77+
78+
METHOD if_apc_wsp_extension~on_close.
79+
80+
TRY.
81+
get_producer( )->send( c_msg-__closed__ ).
82+
83+
CATCH cx_root INTO DATA(error).
84+
RAISE SHORTDUMP error.
85+
ENDTRY.
86+
87+
ENDMETHOD.
88+
89+
90+
METHOD get_active_connections.
91+
92+
SELECT
93+
FROM amc_receiver2
94+
FIELDS COUNT( * )
95+
WHERE channel_id = @( to_lower( |{ c_amc_application_id }{ c_channel_id }| ) )
96+
INTO @result.
97+
98+
ENDMETHOD.
99+
100+
101+
METHOD send.
102+
103+
get_producer( )->send( i_message ).
104+
105+
ENDMETHOD.
11106

12-
CLASS Z2UI5_CL_DEMO_APP_S_05_WS IMPLEMENTATION.
13107
ENDCLASS.
Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,16 @@
11
<?xml version="1.0" encoding="utf-8"?>
22
<abapGit version="v1.0.0" serializer="LCL_OBJECT_CLAS" serializer_version="v1.0.0">
3-
<asx:abap version="1.0" xmlns:asx="http://www.sap.com/abapxml"/>
3+
<asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
4+
<asx:values>
5+
<VSEOCLASS>
6+
<CLSNAME>Z2UI5_CL_DEMO_APP_S_05_WS</CLSNAME>
7+
<LANGU>E</LANGU>
8+
<DESCRIPT>Generated APC WebSocket protocol impementation class</DESCRIPT>
9+
<STATE>1</STATE>
10+
<CLSCCINCL>X</CLSCCINCL>
11+
<FIXPT>X</FIXPT>
12+
<UNICODE>X</UNICODE>
13+
</VSEOCLASS>
14+
</asx:values>
15+
</asx:abap>
416
</abapGit>

src/00/z2ui5_sample.samc.xml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,15 +28,15 @@
2828
<VERSION>A</VERSION>
2929
<NR>1</NR>
3030
<CHANNEL_ID>/news_feed</CHANNEL_ID>
31-
<PROGRAM_ID>Z2UI5_CL_DEMO_APP_352_WS======CP</PROGRAM_ID>
31+
<PROGRAM_ID>Z2UI5_CL_DEMO_APP_S_05_WS=====CP</PROGRAM_ID>
3232
<ACTIVITY>S</ACTIVITY>
3333
</AMC_CHNL_AUTH>
3434
<AMC_CHNL_AUTH>
3535
<APPLICATION_ID>Z2UI5_SAMPLE</APPLICATION_ID>
3636
<VERSION>A</VERSION>
3737
<NR>2</NR>
3838
<CHANNEL_ID>/news_feed</CHANNEL_ID>
39-
<PROGRAM_ID>Z2UI5_CL_DEMO_APP_352_WS======CP</PROGRAM_ID>
39+
<PROGRAM_ID>Z2UI5_CL_DEMO_APP_S_05_WS=====CP</PROGRAM_ID>
4040
<ACTIVITY>C</ACTIVITY>
4141
</AMC_CHNL_AUTH>
4242
</AUTHORITIES>

src/00/z2ui5_sample.sapc.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
<APPLICATION_ID>Z2UI5_SAMPLE</APPLICATION_ID>
88
<VERSION>A</VERSION>
99
<PATH>/sap/bc/apc/sap/z2ui5_sample</PATH>
10-
<CLASS_NAME>Z2UI5_CL_DEMO_APP_352_WS</CLASS_NAME>
10+
<CLASS_NAME>Z2UI5_CL_DEMO_APP_S_05_WS</CLASS_NAME>
1111
<APPLICATION_VERSION>1</APPLICATION_VERSION>
1212
</HEADER>
1313
<TEXT>

0 commit comments

Comments
 (0)