![http://scn.sap.com/servlet/JiveServlet/downloadImage/333927/sap-logo.png]()
Offline OData
The Kapsel Offline OData plugin enables an OData version 2.0 based application to be used when a device or emulator is offline by creating a store on the device.
store = sap.OData.createOfflineStore(properties);
store.open(openStoreSuccessCallback, errorCallback);
Once the store is open and the custom OData client is applied with the following call, all calls made using the datajs library are routed to the offline store.
sap.OData.applyHttpClient();
A set of defining requests specify the data that will populate the offline store.
definingRequests : { contacts : "/ContactSet?$expand=ToContactDetails", customers : "/CustomerSet", regions : "/RegionSet", departments : "/DepartmentSet", countries : "/CountrySet", jobfunctions : "/JobFunctionSet"
}
The data that will be updated when a device is offline should ideally be data that multiple offline users are not simultaneously updating. If possible, partition the data to the subset required by each user. Technically, the offline store has a 16 GB limit but the initial download time, database size and refresh times can be affected by the amount of data being stored on the device. Adding OData filters to the defining requests to limit the data on the device to the subset of data required is one technique to do this.
An offline store can only be used with one OData service. For example, one offline store could be associated with one service such as http://services.odata.org/V2/OData/OData.svc/ or http://services.odata.org/V2/Northwind/Northwind.svc/ but not both.
Once the offline store has been created, changes made to it can be sent to the SMP server via a call to store.flush(). The offline store can update its copy of the data by calling store.refresh(). These calls are independent of each other and are asyncronous calls so they could be run at the same time. The offline store files can be seen at \data\data\com.mycompany.offline2\files when running in an Android emulator as shown below.![image9.PNG]()
All datajs calls are redirected to the offline store after sap.OData.applyHttpClient() is called. The customHttpClient can be removed by calling sap.OData.removeHttpClient().
In SMP 3.0 SDK SP06, $value requests which are used for binary data are not supported. OData function imports are also not supported as the service metadata document does not describe what changes occur as a result of calling them. See also Offline OData Version Support for further details on supported features. For additional details on the Offline OData plugin see the JavaScript file in a project that includes this plugin at
project_name\plugins\com.sap.mp.cordova.plugins.odata\www\OData.js
or the JS Documentation at Kapsel Offline OData Plugin API Reference.
The following samples will help demonstrate the Kapsel Offline OData plugin.
OData Based App
This is a simple OData based app that demonstrates how it cannot read data while the device is offline.
OData Based App with the Kapsel Offline OData Plugin
The Offline OData plugin is added to the project to enable the accessing of OData when device is offline.
Offline enabled App with Create, Update, Delete, Access to the Error Archive
Adds CRUD operations (create, update, delete) and how failed updates are recorded in the ErrorArchive.
Sample that Switches to Offline Usage once the Network is Unavailable and uses Logon Plugin
This sample shows how an application may switch to using an offline store automatically when network connectivity is lost.
Sample that Defines Relationships using $expand
How to use $expand to define relationships between entities when the OData service does not make use of referentialcontraint.
Additional Settings
Demonstrates encryption of the offline store, refreshing a subset of data and use of refresh interval.
Troubleshooting
OData Based App
The following steps will create a simple OData based app that does not use the Kapsel Offline OData plugin.
OData Based App with the Kapsel Offline OData Plugin
The following steps will enable the app to be used when the device or simulator is online or offline.
Offline enabled App with Create, Update, Delete and Access to the Error Archive
The following steps will extend the app to enable create, update and delete operations and will also display the contents of the ErrorArchive which contains any error that occurred during a flush which attempts to send locally made changes on the device to the OData producer.
Note, there is an incompatibility around escaping backslashes in a JSON payload that causes the flush operation against services.odata.org to fail. This issue will be fixed in SMP 3.0 SDK SP05 PL03 patch or SP06.
Note, that this example uses a partial service endpoint in the management cockpit. IE, the endpoint specified is http://services.odata.org instead of http://services.odata.org/V2/(S(readwrite))/OData/OData.svc/. The full URL causes a redirect to a new URL that contains the URL with a session id in it.
Note, that the temporary OData session ID can be reset in this example by clicking on Clear Offline Store, Unregister, Register, and then Read or Open Store.
- http://services.odata.org provides an updateable service. Enter the following URL into a browser to generate a temporary link to the updateable service.
http://services.odata.org/V2/(S(readwrite))/OData/OData.svc/
Notice that it has S(session_id) and it is V2 for OData version 2.0.
- In the management cockpit create a new application with an ID of com.mycompany.offline2, an endpoint of http://services.odata.org
- Create the project.
cordova -d create C:\Kapsel_Projects\OfflineDemo2 com.mycompany.offline2 OfflineDemo2 "{\"plugin_search_path\":\"C:/SAP/MobileSDK3/KapselSDK/plugins/\"}"
cd C:\Kapsel_Projects\OfflineDemo2
cordova -d platform add android
cordova -d create ~/Documents/Kapsel_Projects/OfflineDemo2 com.mycompany.offline2 OfflineDemo2 "{\"plugin_search_path\":\"/Users/i826567/SAP/MobileSDK3/KapselSDK/plugins/\"}"
cd ~/Documents/Kapsel_Projects/OfflineDemo2
cordova -d platform add ios
- Add the Kapsel Offline OData plugin and the Cordova network information plugin.
cordova -d plugin add com.sap.mp.cordova.plugins.odata
cordova plugin add org.apache.cordova.network-information
- Replace C:\Kapsel_Projects\OfflineDemo2\www\index.html with the contents of index2.html.
- Modify the variable smpServerHost in index.html to point to your SMP server.
- Copy the files to the platform directory by running
cordova -d prepare
- Use the Android IDE or Xcode to deploy and run the project.
Note that the Offline OData plugin does not support the Android Intel Atom (x86) emulators.
Select Register and then Read to get a new temporary URL for the OData service.
Note products can now be added to the list, removed or modified. This can occur when the device is online or if it is offline, then when the device is online and the Flush button is pressed, the changes are sent to the OData producer.
![image5.PNG]()
- Details of any problems sending the changes made when the device was offline to the OData producer can be viewed in the ErrorArchive. The following steps can be followed to introduce an error.
With the offline store open, perform a read. Update the price of bread from 2.50 to 2.99.
Close the offline store.
Perform a read and notice the price of bread is 2.50 since the change made with the store closed was not flushed.
Delete bread from products.
Open the offline store and perform a read. Notice that bread appears in products and the price is 2.99.
Flush the offline store which will cause an error as the previously deleted product bread cannot have it price updated.
Click on Check Errors to view the contents of the ErrorArchive. On this screen, the ability to remove the error is provided.
![image6.PNG]()
Additional functionality could be provided to modify the operation and retry it if the problem was an update issue such as one where two different users both modified the same record.
Note that services.odata.org does not use ETags so the last update wins. See also Offline OData Conflicts and Errors and ETag.
Sample that Switches to Offline Usage once the Network is Unavailable and uses Logon Plugin
The following sample listens to online and offline notifications. When the app starts, the offline store is opened, and if it is online the store is refreshed. While the device is online, the offline store is not used. When the device is offline, the OData requests are redirected to the open online store as the sap.OData.applyHttpClient() method is called when the device switches to offline. When the device regains network connectivity, the method sap.OData.removeHttpClient() is called.
If this application performed updates rather than simply reading the data, it might make sense to call refresh following create, update or delete operations so the offline store is always up to date.
Instead of the offline store only being used when the device is offline, another approach is to have the app always use the offline store and to make refresh and flush calls as appropriate.
Additional code could be added to ask the user if it is ok to perform the refresh, or perhaps to check if Wi-Fi is being used and then only perform the refresh.
Unlike the previous two examples, this app uses the Logon plugin to perform the registration with the SMP 3.0 server. It should be noted that
Follow the below steps to try it out.
- Create the project.
cordova -d create C:\Kapsel_Projects\OfflineDemo3 com.mycompany.offline3 OfflineDemo3 "{\"plugin_search_path\":\"C:/SAP/MobileSDK3/KapselSDK/plugins/\"}"
cd C:\Kapsel_Projects\OfflineDemo3
cordova -d platform add android
cordova -d create ~/Documents/Kapsel_Projects/OfflineDemo3 com.mycompany.offline3 OfflineDemo3 "{\"plugin_search_path\":\"/Users/i826567/SAP/MobileSDK3/KapselSDK/plugins/\"}"
cd ~/Documents/Kapsel_Projects/OfflineDemo3
cordova -d platform add ios
- Replace C:\Kapsel_Projects\OfflineDemo3\www\index.html with the contents of index3.html.
- Modify the variable smpServerHost in index.html to point to your SMP server.
- Add the Kapsel and Cordova plugins.
cordova -d plugin add com.sap.mp.cordova.plugins.logon
cordova -d plugin add com.sap.mp.cordova.plugins.odata
cordova plugin add org.apache.cordova.network-information
- Copy the files to the platform directory by running
cordova prepare
- Use the Android IDE or Xcode to deploy and run the project.
![image7.PNG]()
Sample that Defines Relationships using $expand
The definition of a service can be examined by opening the following URL. http://services.odata.org/V2/OData/OData.svc/
This shows that there are three collections available named Products, Categories and Suppliers. For further details see the following URL. http://services.odata.org/V2/OData/OData.svc/$metadata
Notice that Products is defined as an EntityType of OData.Product and it has a set of NavigationProperties. Specifically it defines that a Product has a Supplier and a Product has a Category. When the offline store is created it needs to know about these relationships to correctly create the tables and relationships between the tables. If the metadata does not specify a referentialconstraint as this service does not, the defining requests will need to use the $expand format to specify how the tables are related. This is explained in more detail at Using Defining Requests to Build Entity Relationships
The following example will attempt to illustrate this.
The following sample displays a table of categories as links that when clicked on shows the products in the clicked on category and the supplier of the product. To make this data available when the device is offline, we need all three entities. The following defining requests were used initially when creating this sample.
"definingRequests" : { //the below requests will be used to populate the offline store "CategoriesDR" : "/Categories", "ProductsDR" : "/Products", "SuppliersDR" : "/Suppliers"
}
Then the following query could be used to retrieve the Categories.
/Categories?$orderby=Name desc
When a category is clicked on a second query can be performed to return the products and supplier information for a given category. Here are a couple of queries that could be used.
/Products?$expand=Supplier,Category&$filter=Category/ID eq 0&$orderby=Name desc
or
/Categories(1)/Products?$expand=Supplier&$orderby=Name desc
Unfortunately, the above queries returns 0 results when the offline store is open since the relationships between the entities are not defined with ReferentialContaint. See also ReferentialConstraint Element
Since we are not able to change the OData service, the relationships can be specified by using expand in the defining requests as shown below.
"definingRequests" : { //the below requests will be used to populate the offline store "CategoriesDR" : "/Categories?$expand=Products/Supplier" //"ProductsDR" : "/Products?$expand=Category,Supplier" //this also works
}
Try out the complete example by following the below steps.
- Create the project.
cordova -d create C:\Kapsel_Projects\OfflineDemo4 com.mycompany.offline4 OfflineDemo4 "{\"plugin_search_path\":\"C:/SAP/MobileSDK3/KapselSDK/plugins/\"}"
cd C:\Kapsel_Projects\OfflineDemo4
cordova -d platform add android
cordova -d create ~/Documents/Kapsel_Projects/OfflineDemo4 com.mycompany.offline4 OfflineDemo4 "{\"plugin_search_path\":\"/Users/i826567/SAP/MobileSDK3/KapselSDK/plugins/\"}"
cd ~/Documents/Kapsel_Projects/OfflineDemo4
cordova -d platform add ios
- Add the Kapsel Offline OData plugin and the Cordova network information plugin.
cordova -d plugin add com.sap.mp.cordova.plugins.odata
cordova plugin add org.apache.cordova.network-information
- Replace C:\Kapsel_Projects\OfflineDemo4\www\index.html with the contents of index4.html.
- Modify the variable smpServerHost in index.html to point to your SMP server.
- Copy the files to the platform directory by running
cordova -d prepare
- Use the Android IDE or Xcode to deploy and run the project.
Press Register > Read > Electronics
![image11.PNG]()
Additional Settings
The following section provides examples of some additional settings that can be set.
Encrypting the Offline Database
Refreshing a Subset of the Offline Data
Prepopulate Offline Database and Refresh Interval of Shared Data
Encrypting the Offline Database
To encrypt the data in the offline stores, specify an encryption key. Without this, it is possible on an Android or iOS simulator to access the UltraLite database files and view the data as shown below.
![image10.PNG]()
The following option can be provided when opening the store to encrypt the stores using AES-256.
var options = { "storeEncryptionKey" : "myVerySecretKey123!" //"storeEncryptionKey" : applicationContext.registrationContext.password //if using the Logon plugin, the user entered password for the registration can be used if it never changes
};
store.open(openStoreSuccessCallback, errorCallback, options);
A better solution than hardcoding the password would be to generate a random password and then to store it in the datavault provided by the Logon plugin. Here is an example of how that might look.
var otp = null; //one time password. Must be set once the first time the app starts
function logonSuccessCallback() {
getOneTimePassword(); ...
}
function getOneTimePassword() {
sap.Logon.get(getSuccess, errorCallback, "key");
}
function set(val) {
sap.Logon.set(getSuccess, errorCallback, "key", val);
}
function getSuccess(val) {
if (val == null) { set(Math.random().toString(36).substring(16)); return; } otp = val;
}
function openStore() {
... var options = { "storeEncryptionKey" : otp }; store.open(openStoreSuccessCallback, errorCallback, options);
Refreshing a Subset of the Offline Data
When performing a refresh, if it is only a subset of the data that changes often, in the refresh call it is possible to specify which defining requests should be refreshed. Assume the application has the following defining requests.
"definingRequests" : { //the below requests will be used to populate the offline store "CategoriesDR" : "/Categories", "ProductsDR" : "/Products", "SuppliersDR" : "/Suppliers"
}
To only refresh the Products and Suppliers, the following call could be made.
store.refresh(refreshStoreCallback, errorCallback, ["SuppliersDR", "ProductsDR"]);
Prepopulate Offline Database and Refresh Interval of Shared Data
The database used on the device to store the offline data is created and optionally initially populated on the SMP server before it is sent to the device the first time the store is opened. This can speed up the time taken when the offline store opens for the first time. As well if the data is cached in the SMP server, calls to refresh the data from the device will use the cached data in the SMP server rather than making requests to the OData producer.
Assume the application has the following defining requests.
"definingRequests" : { //the below requests will be used to populate the offline store "CategoriesDR" : "/Categories", "ProductsDR" : "/Products", "SuppliersDR" : "/Suppliers"
}
Also assume that the following application configuration file is specified in the management cockpit under Applications > com.mycompany.offline > Import Settings
[endpoint]
Name=com.mycompany.offline
prepopulate_offline_db=Y
prepopulate_offline_db_interval=1440
[defining_request]
name=CategoriesDR
is_shared_data=Y
refresh_interval=1440
track_deltas=NEVER
delta_token_lifetime=0
[defining_request]
name=ProductsDR
is_shared_data=Y
refresh_interval=1440
track_deltas=NEVER
delta_token_lifetime=0
[defining_request]
name=SuppliersDR
is_shared_data=Y
refresh_interval=1440
track_deltas=NEVER
delta_token_lifetime=0
The above configuration file specifies that the offline database is prepopulated and filled with data that is at most less than one day old (1440 minutes = 60 minutes * 24 hours).
It also indicates that if the mobile device requests a refresh operation and the data on the server is less than one day old, the SMP server uses the cached data rather than contacting the OData producer.
Note, these options are further explained at Defining an Application Configuration File with Defining Requests.
Troubleshooting
When the store fails to open or fails during a flush or refresh, additional details regarding the error can often be seen in one of three log files; the SMP server log file, the JavaScript console or the device log.
The Offline component of the SMP server should have its log level increased when debugging.
![image8.PNG]()
The SMP server's log file is located at
C:\SAP\MobilePlatform3\Server\log\YKFN00528072A-smp-server.log
The JavaScript console log can also be useful to monitor. To do so, Open Chrome and press Ctrl Shift I when using an Android 4.4 emulator or device or use Safari on a Mac and choose Develop iPhone Simulator or device. See also Debugging Appendix.
Finally the Android or iOS log can also be useful.
The following are some examples of error conditions and the associated logged messages for these problems.
Version 3 OData Endpoint used with store.open
The endpoint in the management cockpit was modified from
http://services.odata.org/V2/OData/OData.svc
to
http://services.odata.org/V3/OData/OData.svc
JavaScript console from debugging an Android device.
store.open called at 14:20.20 index.html:270
An error occurred "Unknown network error occured" index.html:69
Device is ONLINE
Android LogCat Output
10-29 14:20:20.538: I/chromium(16869): [INFO:CONSOLE(270)] "store.open called at 14:20.20", source: file:///android_asset/www/index.html (270)
10-29 14:20:25.653: E/SMP_ODATA(16869): Failed to open store
10-29 14:20:25.653: E/SMP_ODATA(16869): com.sap.smp.client.odata.exception.ODataNetworkException: Unknown network error occured
10-29 14:20:25.653: E/SMP_ODATA(16869): at com.sap.smp.client.odata.offline.ODataOfflineStore.openStoreSync(ODataOfflineStore.java:500)
10-29 14:20:25.653: E/SMP_ODATA(16869): at com.sap.smp.client.odata.offline.ODataOfflineStore$OpenStoreWithOptionsThread.run(ODataOfflineStore.java:406)
10-29 14:20:25.653: E/SMP_ODATA(16869): Caused by: com.sap.smp.client.odata.offline.ODataOfflineException: [-10210] The operation failed due to an error on the server.
10-29 14:20:25.653: E/SMP_ODATA(16869): ... 2 more
Here are some snippets from the SMP server log file.
2014 10 29 14:20:37#0-400#ERROR#com.sap.mobile.platform.server.mobilink.SessionLogger##anonymous#Thread-213###[-100099] An error occurred while parsing the metadata document for service "https://10.7.171.223:8080/com.mycompany.offline" com.sap.odata.offline.util.MODataException: [-100099] An error occurred while parsing the metadata document for service "https://10.7.171.223:8080/com.mycompany.offline"
...
Caused by: org.apache.olingo.odata2.api.ep.EntityProviderException: Invalid or missing namespace for 'Schema'.
Incorrect properties passed to store.open
Notice that the serviceRoot is incorrect. It has an x added to the end of value. The service root should be a connection name such as com.mycompany.offline.
var properties = { "name": "ProductsOfflineStore", "host": smpServerHost, "port": smpServerPort, "https": smpServerProtocol == "https", "serviceRoot" : "com.mycompany.offlinex", "streamParams" : "custom_header=Authorization:" + authStr + ";", "definingRequests" : { "ProductsDR" : "/Products" }
};
store = sap.OData.createOfflineStore(properties);
JavaScript console from debugging an iOS simulator.
[Log] store.open called at 11:10.06 (index.html, line 270)
[Log] An error occurred "[-10210] The operation failed due to an error on the server." (index.html, line 69)
[Log] Device is ONLINE (index.html, line 264)
Here are some snippets from the SMP server log file.
2014 10 29 11:09:38#0-400#INFO#com.sap.mobile.platform.server.mobilink.SessionLogger##anonymous#Thread-229####null#null#null#info#Offline#null#null#18730952-12fa-4f42-b611-21b1468c5051#null#1414609778664#null#com.sap.mobile.platform.server.mobilink.SessionLogger:info#Service root: https://10.7.171.223:8080/com.mycompany.offlinex#null#385#null#28#null |
...
2014 10 29 11:09:38#0-400#INFO#com.sap.mobile.platform.server.mobilink.SessionLogger##anonymous#Thread-229####null#null#null#info#Offline#null#null#18730952-12fa-4f42-b611-21b1468c5051#null#1414609778745#null#com.sap.mobile.platform.server.mobilink.SessionLogger:info#Sending HTTP GET "https://10.7.171.223:8080/com.mycompany.offlinex/$metadata"#null#385#null#89#null |
2014 10 29 11:09:38#0-400#ERROR#com.sap.mobile.platform.server.mobilink.SessionLogger##anonymous#Thread-229###[-100025] An error occurred while communicating with the OData server to retrieve the result of request "https://10.7.171.223:8080/com.mycompany.offlinex/$metadata" com.sap.odata.offline.util.MODataException: [-100025] An error occurred while communicating with the OData server to retrieve the result of request "https://10.7.171.223:8080/com.mycompany.offlinex/$metadata"
...
Caused by: com.sap.odata.offline.util.MODataException: [-100010] Retrieve metadata failed because the OData server returned HTTP code, 404, with message: null
Incorrect Credentials Passed to store.open
Notice the addition of 123456 to the authorization header
var properties = { "name": "ProductsOfflineStore", "host": smpServerHost, "port": smpServerPort, "https": smpServerProtocol == "https", "serviceRoot" : appID, //There is a cookie store for JavaScript which is different from the Java one used by the Offline plugin "streamParams" : "custom_header=Authorization:123456" + authStr + ";custom_header=X-SMP-APPCID:" + appCID + ";", "definingRequests" : { "ProductsDR" : "/Products" }
};
store = sap.OData.createOfflineStore(properties);
JavaScript Console from debugging an Android device.
store.open called at 13:53.33 index.html:270
An error occurred "Unknown network error occured" index.html:69
Device is ONLINE
Android LogCat Output
10-29 13:53:33.651: I/chromium(754): [INFO:CONSOLE(270)] "store.open called at 13:53.33", source: file:///android_asset/www/index.html (270)
10-29 13:53:56.713: E/SMP_ODATA(754): Failed to open store
10-29 13:53:56.713: E/SMP_ODATA(754): com.sap.smp.client.odata.exception.ODataNetworkException: Unknown network error occured
10-29 13:53:56.713: E/SMP_ODATA(754): at com.sap.smp.client.odata.offline.ODataOfflineStore.openStoreSync(ODataOfflineStore.java:500)
10-29 13:53:56.713: E/SMP_ODATA(754): at com.sap.smp.client.odata.offline.ODataOfflineStore$OpenStoreWithOptionsThread.run(ODataOfflineStore.java:406)
10-29 13:53:56.713: E/SMP_ODATA(754): Caused by: com.sap.smp.client.odata.offline.ODataOfflineException: [-10207] Communication with the server failed due to invalid authentication
10-29 13:53:56.713: E/SMP_ODATA(754): ... 2 more
Here are some snippets from the SMP server log file.
2014 10 29 13:53:59#0-400#ERROR#com.sap.mobile.platform.server.coreservices.configuration.service.ApplicationConnectionServiceImpl##anonymous#http-bio-8080-exec-10####null#null#null#error#Registration#null#null#ddafa3cc1fa24acab78726e30bd48967#null#1414619639774#null#com.sap.mobile.platform.server.coreservices.configuration.service.ApplicationConnectionServiceImpl:isAppConnInputValid#Invalid application connection#null#644#null#0#null |
2014 10 29 13:53:59#0-400#ERROR#com.sap.mobile.platform.server.online.filter.application.SMPApplicationSecurityFilter##anonymous#http-bio-8080-exec-10####null#null#null#error#Other#null#null#ddafa3cc1fa24acab78726e30bd48967#null#1414619639774#null#com.sap.mobile.platform.server.online.filter.application.SMPApplicationSecurityFilter:doFilter#Application connection is not found::null#null#644#null#1#null |
SMP Server not reachable during a Flush or Refresh
JavaScript Console output from debugging an iOS simulator.
[Log] store.flush called at 10:58.56 (index.html, line 537)
[Log] An error occurred "[-10060] An error occurred while performing a synchronization. Reason: -1305 (MOBILINK_COMMUNICATIONS_ERROR) %1:220 %2:The operation couldn't be completed. Connection refused %3:61" (index.html, line 95)
[Log] Device is ONLINE (index.html, line 531)
Network Disconnected during a Flush or Refresh
JavaScript Console output from debugging an iOS simulator.
[Log] store.open called at 10:12.04 (index.html, line 537)
[Log] Store opened in 0.694 seconds at 10:12.04 (index.html, line 537)
[Log] Store is OPEN. Device is ONLINE (index.html, line 531)
[Log] store.refresh called at 10:12.10 (index.html, line 537)
[Log] Device is OFFLINE (index.html, line 531)
[Log] An error occurred "[-10060] An error occurred while performing a synchronization. Reason: -1305 (MOBILINK_COMMUNICATIONS_ERROR) %1:220 %2:The operation couldn't be completed. Network is unreachable %3:51" (index.html, line 95)
[Log] Device is OFFLINE (index.html, line 531)
Note, that the flush or refresh operation continues with a short network disconnect.
JavaScript Console output
[Log] store.flush called at 10:56.06 (index.html, line 537)
[Log] Device is OFFLINE (index.html, line 531)
[Log] Device is ONLINE (index.html, line 531)
[Log] Store flushed in 15.39 seconds at 10:56.22 (index.html, line 537)
The above provide examples of a few of the different scenarios that lead to an error condition and what to expect in the logs when these errors occur.
Back to Getting Started With Kapsel