Welcome to part 6 of this blog series introducing
abap2UI5 — an open-source project for developing UI5 apps purely in ABAP.
This post explains the installation, configuration and troubleshooting steps of abap2UI5.
Blog Series & More
You can find all the information about this project on
GitHub, stay up-to-date by following on
Twitter and be sure to explore the other articles of this blog series:
Content
This post covers the following areas:
- Installation
- Install the Project
- Create a new HTTP Service
- Implement the Handler Method
- Configuration
- Options & URL Parameters
- Title
- Synchronize the Configuration
- Theme
- Bootstrapping
- Launchpad
- CSS
- Security
- Debugging
- Frontend
- Backend
- Conclusion
Let’s begin with the first topic.
1. Installation
1.1. Install the project with abapGit
If you are new to abapGit, start by reviewing this
Guideline for on-premise systems and this
Tutorial for cloud environments.
The project is based on a single code line for both language versions (ABAP Cloud, Standard ABAP), so you can pull this
repository in both cases. For lower releases (NW 7.03 to 7.40) use this
downport repository.
1.2. Create a new HTTP Service
Next, create a new HTTP service in your system. In an on-premise environment, you need to create and configure a new ICF service. Follow this
guideline for that and see how to develop a new HTTP request handler
here. In a cloud scenario, follow this
tutorial.
1.3. Implement the Handler Method
Now copy the following implementation into your new handle_request method.
ABAP Standard:
METHOD if_http_extension~handle_request.
DATA(lv_resp) = SWITCH #( server->request->get_method( )
WHEN 'GET' THEN z2ui5_cl_fw_http_handler=>http_get( )
WHEN 'POST' THEN z2ui5_cl_fw_http_handler=>http_post( server->request->get_cdata( ) ) ).
server->response->set_header_field( name = `cache-control` value = `no-cache` ).
server->response->set_cdata( lv_resp ).
server->response->set_status( code = 200 reason = `success` ).
ENDMETHOD.
ABAP Cloud:
METHOD if_http_service_extension~handle_request.
DATA(lv_resp) = SWITCH #( request->get_method( )
WHEN 'GET' THEN z2ui5_cl_fw_http_handler=>http_get( )
WHEN 'POST' THEN z2ui5_cl_fw_http_handler=>http_post( request->get_text( ) ) ).
response->set_status( 200 )->set_text( lv_resp
)->set_header_field( i_name = `cache-control` i_value = `no-cache` ).
ENDMETHOD.
By calling your new HTTP handler via browser, you can start abap2UI5 and see the landing page:

abap2UI5 Landing Page
Optionally you can install the abap2UI5
samples repository next and check out all the examples:

abap2UI5 Samples Repository
Now you are ready to develop your first own app. See the first
blog post to find more information about the development process.
2. Configuration
2.1. Options and URL Parameters
There are two ways to set the configuration: one is by setting it via URL parameter, and the other option is by importing it as a configuration by calling the index HTML.
By default, the following parameters are set:
lt_config = VALUE #(
( n = `src` v = `https://sdk.openui5.org/resources/sap-ui-cachebuster/sap-ui-core.js` )
( n = `data-sap-ui-theme` v = `sap_horizon` )
( n = `data-sap-ui-async` v = `true` )
( n = `data-sap-ui-bindingSyntax` v = `complex` )
( n = `data-sap-ui-frameOptions` v = `trusted` )
( n = `data-sap-ui-compatVersion` v = `edge` ) ).
If you want to make changes, simply copy the table, adjust the necessary parameters and then import the table again when calling the method:
DATA(lt_config) = VALUE z2ui5_if_client=>ty_t_name_value(
( n = `data-sap-ui-theme` v = `sap_belize` ) "<- adjusted
( n = `src` v = `https://sdk.openui5.org/resources/sap-ui-cachebuster/sap-ui-core.js` )
( n = `data-sap-ui-async` v = `true` )
( n = `data-sap-ui-bindingSyntax` v = `complex` )
( n = `data-sap-ui-frameOptions` v = `trusted` )
( n = `data-sap-ui-compatVersion` v = `edge` ) ).
DATA(lv_resp) = SWITCH #( request->get_method( )
WHEN 'GET' THEN z2ui5_cl_fw_http_handler=>http_get( lt_config )
WHEN 'POST' THEN z2ui5_cl_fw_http_handler=>http_post( request->get_text( ) ) ).
You can find a list of all configuration parameters
here. Additionally, you can modify these parameters with the sap-ui- prefix to use them as URL parameters.
2.2. Title
You can set the title with the following snippet in your definition of the view:
DATA(view) = z2ui5_cl_xml_view=>factory( ).
view->_z2ui5( )->title( i_client->_bind_edit( `My Title` )

abap2UI5 with changed title
Check out the following
sample.
2.4. Synchronize the Configuration
You can also synchronize your configurations with all other ui5 apps in your system by reading the customizing from the following table prior to making the method call (Enjoy the view – this is the only SAP GUI screenshot included in this blog series
😉😞

Configuration SAP UI5 Bootstrapping
2.4. Theme
The most common change is to the theme. You can find all available themes
here. The newest theme is Horizon (sap_horizon) and it is used in all the demos of this blog series. Other popular themes are:
 |
 |
Belize (sap_belize) |
Quartz Light (sap_fiori_3) |
 |
 |
Evening Horizon (sap_horizon_dark) |
High Contrast Black (sap_horizon_hcb) |
2.5. Bootstrapping
In an on-premise landscape, you can bootstrap the UI5 library from your local system. Typically, the path is "/sap/public/bc/ui5_ui5/resources/sap-ui-core.js" or "resources/sap-ui-core.js". In a cloud scenario, you can refer to SAP guidelines available
here.
2.6. Launchpad
Abap2UI5 is based on a single-page index.html, which makes it not compatible with FLP out-of-the-box (since FLP replaces the index.html). However, it is no problem to encapsulate abap2UI5 in a UI5 standard app for the use with launchpads. Check out and install this additional
repository.
2.7. CSS
You can change the CSS by sending HTML with your View in your app. An example can be found
here:

abap2UI5 app with changed CSS
3. Security
At the backend, abap2UI5 is a plain HTTP handler that every user creates and configures by themselves (visibility, authentication & other security parameters). In the implementation of your apps you have to take care of a secure programming style like always when developing HTTP-Handlers (call authorization checks, avoid dynamic SQL etc.). Check
this for more information.
At the frontend, abap2UI5 is a normal one page UI5 application. It loads the external library UI5 from a CDN or your own customized directory. The UI5 framework is used to render the HTML and only methods of the UI5 framework are called to handle the all events.
Additionally to prevent cross-site-scripting the following parameter are set in the index.html:
<meta http-equiv="Content-Security-Policy" content="default-src 'self' 'unsafe-inline' 'unsafe-eval' ui5.sap.com *.ui5.sap.com sdk.openui5.org *.sdk.openui5.org cdn.jsdelivr.net *.cdn.jsdelivr.net"/>
It only allows libraries from the same server, ui5.sap.com, openui5.com or cdn.jsdelivr.net, which we needed to use for some external libraries. Adjust the importing parameter 'content-security-policy' when you want to include more external URLs:
DATA(lv_resp) = SWITCH #( request->get_method( )
WHEN 'GET' THEN z2ui5_cl_fw_http_handler=>http_get(
content_security_policy = `<meta http-equiv="Content-Security-Policy" content="default-src 'self' 'unsafe-inline' 'unsafe-eval' ui5.sap.com *.ui5.sap.com sdk.openui5.org *.sdk.openui5.org cdn.jsdelivr.net *.cdn.jsdelivr.net"/>` )
WHEN 'POST' THEN z2ui5_cl_fw_http_handler=>http_post( request->get_text( ) ) ).
You can find more information about CSP
here.
4. Debugging
When your app is in the development process, you can activate the debugging tools by changing the following parameter:
DATA(lv_resp) = SWITCH #( request->get_method( )
WHEN 'GET' THEN z2ui5_cl_fw_http_handler=>http_get(
check_debugging = abap_true )
WHEN 'POST' THEN z2ui5_cl_fw_http_handler=>http_post( request->get_text( ) ) ).
4.1. Frontend
After that, you can can start an app and press the shortcut STRG+A and the debugging tools are displayed:

abap2UI5 Debugging Tools
Next follow the left menu and press for example View XML:

abap2UI5 Debugging Tools - XML-View
Most of the issues arise because the XML is not valid. You can check it there or copy & paste it to an XML validator. Another good way to test the XML are UI5 sandboxes, such as the
OpenUI5 Sandbox.
You can also check the View Model and previous request here. If a parameter is bound with _bind_one, it should be written in the oViewModel. If a parameter is bound with _bind, it should be written in oUpdate. You can also check the last request to ensure that all updated values have been sent to the server.
To take a more detailed look at the UI, use the
UI5 Inspector. This tool is helpful for analyzing and checking certain controls:

UI5 Inspector with an abap2UI5 app
You can find more guidelines
here.
Also, keep in mind that abap2UI5 is based on REST, so you don't need to restart the app all the time after a change, like in the former screen logic where changes were only visible after restarting. Just triggering a server roundtrip is enough to see the changes:

View Development in abap2UI5
4.2. Backend
Set a breakpoint in your app and check the values that abap2UI5 provides you, as well as the values you give back to abap2UI5. Check if the view XML is filled and if it is valid. Normally, abap2UI5 throws an exception if something unexpected happens, which can help you to identify the problem. If you want to gain a deeper understanding, you can also debug the framework itself.
The framework is based on a single http handler. Set a breakpoint here and check incoming requests and outgoing responses:

abap2UI5 HTTP Handler
The initial request loads the UI5 index.html, which is independent of your application and should normally not cause any problems:

abap2UI5 Get Handler (index.html)
After this, the AJAX roundtrip logic begins. Every event and interaction creates a new HTTP Post request, which triggers the following method:

abap2UI5 Post Handler
As you can see, we call the user's app on line 44. You can also check if your app has been successfully updated after the frontend on line 39 and check the following method:

Update app after frontend (PAI)
And the reverse direction, setting the response with the values of your app in this method:

Create frontend model before output (PBO)
If you find a bug in the framework or running into problems with your app, feel free to open an
issue.
5. Conclusion
This was part six of this introduction to
abap2UI5. You now have an understanding how to install & configure it and got insights into troubleshooting & debugging.
In the next
blog post, we will focus on the technical background of this framework and summarize all the project's key ideas by covering topics such as its architecture, codebase and compatibility.
Thank you for reading! Your questions, comments and wishes for this project are always welcome, create an
issue or leave a comment.