Skip to content

Commit 0f0e16a

Browse files
Standardize error message handling (#221)
* Parse error responses from back-end in logging method * Default error callback will attempt to parse an error message.
1 parent 33df3f2 commit 0f0e16a

File tree

9 files changed

+37
-42
lines changed

9 files changed

+37
-42
lines changed

src/main/java/com/ericsson/ei/frontend/utils/BackEndInformationControllerUtils.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -60,8 +60,8 @@ public ResponseEntity<String> handleRequestForInstances(HttpServletRequest reque
6060
} catch (Exception e) {
6161
LOG.error("ERROR!\n" + e.getMessage());
6262
return new ResponseEntity<>(
63-
"[{\"name\":\"Unable to load instances\",\"host\":\"NO HOST\",\"port\":\"NO PORT\",\"contextPath\":\"/\"}]",
64-
getHeaders(), HttpStatus.OK);
63+
"{\"message\": \"Failure when trying to load backend instances\"}",
64+
getHeaders(), HttpStatus.NOT_FOUND);
6565
}
6666
}
6767

src/main/resources/static/css/ui.css

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ body {
8989
cursor: pointer;
9090
}
9191
.app-header .alert-menu .alert-list .alert-message.expand {
92-
white-space: normal;
92+
white-space: pre-line;
9393
}
9494
.app-header .alert-menu .alert-list .alert-remove {
9595
display: flex;
@@ -214,6 +214,8 @@ body {
214214
}
215215
.nav-link > span {
216216
color: #c1c1c1;
217+
}
218+
.app-header .nav-link > span {
217219
font-size: 90%;
218220
}
219221
.nav-link:hover > span{
@@ -389,6 +391,7 @@ body {
389391
}
390392
.sidebar.sidebar-minimized .sidebar-nav .nav > .nav-item > .nav-link {
391393
color: transparent;
394+
padding-right: 0 !important;
392395
}
393396
.sidebar.sidebar-minimized .sidebar-nav .nav > .nav-item .fa {
394397
width: 50px;

src/main/resources/static/js/add-instances.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ jQuery(document).ready(function () {
2727
contentType: 'application/json; charset=utf-8',
2828
cache: false,
2929
error: function (XMLHttpRequest, textStatus, errorThrown) {
30-
window.logMessages(JSON.parse(XMLHttpRequest.responseText)["message"]);
30+
parseAndLogMessage(XMLHttpRequest.responseText);
3131
},
3232
success: function (responseData, XMLHttpRequest, textStatus) {
3333
$.jGrowl(responseData.message, { sticky: false, theme: 'Notify' });

src/main/resources/static/js/common.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,8 @@ AjaxHttpSender.prototype.sendAjax = function (contextPath, type, data, callback,
4949
error: function (XMLHttpRequest, textStatus, errorThrown) {
5050
if(typeof callback.error === 'function') {
5151
callback.error(XMLHttpRequest, textStatus, errorThrown);
52+
} else {
53+
parseAndLogMessage(XMLHttpRequest.responseText);
5254
}
5355
},
5456
success: function (responseData, textStatus) {
@@ -165,7 +167,7 @@ function updateBackEndInstanceList() {
165167
contentType: 'application/json; charset=utf-8',
166168
cache: false,
167169
error: function (XMLHttpRequest, textStatus, errorThrown) {
168-
window.logMessages("Failure when trying to load backend instances");
170+
parseAndLogMessage(XMLHttpRequest.responseText);
169171
},
170172
success: function (responseData, XMLHttpRequest, textStatus) {
171173
var observableObject = $("#selectInstances")[0];

src/main/resources/static/js/errorMessages.js

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,13 +68,17 @@ ko.cleanNode($("#alertsItem")[0]);
6868
ko.applyBindings(vm, $("#alertsItem")[0]);
6969
vm.stopPropagation();
7070

71-
function logMessages(message) {
71+
function logMessage(message) {
7272
$.jGrowl(message, { sticky: false, theme: 'Error', position: 'center' });
7373
vm.addErrorMessage(message);
7474
vm.storeErrorMessage(message);
7575
vm.stopPropagation();
7676
}
7777

78+
function parseAndLogMessage(message) {
79+
logMessage(JSON.parse(message).message);
80+
}
81+
7882
$('#alertsLink').on('click', function (event) {
7983
vm.resetExpandMessage();
8084
vm.mergeErrorMessages();

src/main/resources/static/js/login.js

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ jQuery(document).ready(function () {
2020
this.login = function (userState, remember) {
2121
var dataJSON = JSON.parse(ko.toJSON(userState));
2222
if (dataJSON.ldapUserName == "" || dataJSON.password == "") {
23-
window.logMessages("Username and password fields cannot be empty");
23+
logMessage("Username and password fields cannot be empty");
2424
} else {
2525
var token = window.btoa(dataJSON.ldapUserName + ":" + dataJSON.password);
2626
sendLoginRequest(token);
@@ -44,14 +44,15 @@ jQuery(document).ready(function () {
4444
error: function (XMLHttpRequest, textStatus, errorThrown) {
4545
var statusCode = XMLHttpRequest.status;
4646

47+
// These error messages are not standardized.
4748
if (statusCode == 401) {
48-
window.logMessages("Error Status code: 401 'Unauthorized or bad credentials'");
49+
logMessage("Status code: 401, 'Unauthorized or bad credentials'");
4950
$('#loginError').text("Invalid username and/or password!");
5051
} else if (statusCode == 500 && !isBackEndStatusOk()) {
51-
window.logMessages("Error back-end is not reachable!");
52+
logMessage("Status code: 500, Could not reach back-end");
5253
$('#loginError').text("Back-end might be unavailable!");
5354
} else {
54-
window.logMessages("Error Status Code: " + statusCode + " 'Unknown server error'");
55+
logMessage("Status Code: " + statusCode + ", 'Unknown server error'");
5556
}
5657

5758
$('#loginError').addClass("is-invalid");

src/main/resources/static/js/subscription.js

Lines changed: 6 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -389,7 +389,7 @@ jQuery(document).ready(function () {
389389
"data": null,
390390
"render": function (data, type, row, meta) {
391391
if (data == undefined || row == undefined) {
392-
window.logMessages("Error: Subscription data is not defined");
392+
logMessage("Subscription data is not defined");
393393
return '';
394394
}
395395
subscriptionOwner = row.ldapUserName;
@@ -471,7 +471,7 @@ jQuery(document).ready(function () {
471471
reload_table();
472472
var responseJSON = JSON.parse(XMLHttpRequest.responseText);
473473
for (var i = 0; i < responseJSON.length; i++) {
474-
window.logMessages("Error deleting subscription: [" + responseJSON[i].subscription + "] Reason: [" + responseJSON[i].reason + "]");
474+
logMessage("Failed to delete subscription: [" + responseJSON[i].subscription + "] Reason: [" + responseJSON[i].reason + "]");
475475
}
476476
}
477477
};
@@ -502,7 +502,7 @@ jQuery(document).ready(function () {
502502

503503
// Check if no Subscription has been marked to be deleted.
504504
if (subscriptionsToDelete.length < 1) {
505-
window.logMessages("No subscriptions has been marked to be deleted.");
505+
logMessage("No subscriptions has been marked to be deleted.");
506506
return;
507507
}
508508

@@ -521,7 +521,7 @@ jQuery(document).ready(function () {
521521
request.responseType = "application/json;charset=utf-8";
522522
request.onload = function (event) {
523523
if (this.responseText == "") {
524-
window.logMessages("Failed to download template, Error: Could not contact the backend server.");
524+
logMessage("Failed to download template. Could not contact the backend server.");
525525
} else {
526526
var jsonData = JSON.stringify(JSON.parse(request.response), null, 2);
527527
downloadFile(jsonData, "application/json;charset=utf-8", "subscriptionsTemplate.json");
@@ -560,7 +560,7 @@ jQuery(document).ready(function () {
560560
return true;
561561
} catch (e) {
562562
if (logError) {
563-
window.logMessages("JSON Format Check Failed:\n" + e.name + "\n" + e.message);
563+
logMessage("JSON Format Check Failed:\n" + e.name + "\n" + e.message);
564564
}
565565
return false;
566566
}
@@ -586,13 +586,8 @@ jQuery(document).ready(function () {
586586
}
587587
},
588588
error: function (XMLHttpRequest, textStatus, errorThrown) {
589-
var errorMessage = "";
590589
reload_table();
591-
var responseJSON = JSON.parse(XMLHttpRequest.responseText);
592-
for (var i = 0; i < responseJSON.length; i++) {
593-
errorMessage = errorMessage + responseJSON[i].subscription + " :: " + responseJSON[i].reason + "\n";
594-
}
595-
window.logMessages("Failed to create Subscriptions:\n" + errorMessage);
590+
parseAndLogMessage(XMLHttpRequest.responseText);
596591
}
597592
};
598593
// Perform AJAX
@@ -632,9 +627,6 @@ jQuery(document).ready(function () {
632627
var callback = {
633628
success: function (responseData, textStatus) {
634629
populate_json(responseData, mode);
635-
},
636-
error: function (XMLHttpRequest, textStatus, errorThrown) {
637-
window.logMessages("Error: " + XMLHttpRequest.responseText);
638630
}
639631
};
640632
// Perform AJAX

src/main/resources/static/js/switch-instances.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ jQuery(document).ready(function () {
3030
contentType: 'application/json; charset=utf-8',
3131
cache: false,
3232
error: function (XMLHttpRequest, textStatus, errorThrown) {
33-
window.logMessages(XMLHttpRequest.responseText);
33+
parseAndLogMessage(XMLHttpRequest.responseText);
3434
},
3535
success: function (responseData, XMLHttpRequest, textStatus) {
3636
$.jGrowl(responseData.message, { sticky: false, theme: 'Notify' });
@@ -50,7 +50,7 @@ jQuery(document).ready(function () {
5050
contentType: 'application/json; charset=utf-8',
5151
cache: false,
5252
error: function (XMLHttpRequest, textStatus, errorThrown) {
53-
window.logMessages("Failure when trying to load backend instances");
53+
parseAndLogMessage(XMLHttpRequest.responseText);
5454
},
5555
success: function (responseData, XMLHttpRequest, textStatus) {
5656
var observableObject = $("#instancesModel")[0];

src/main/resources/static/js/testrules.js

Lines changed: 9 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ jQuery(document).ready(function () {
1616
var context = ko.contextFor(event.target);
1717
self.rulesBindingList.splice(context.$index(), 1);
1818
if (self.rulesBindingList().length == 0) {
19-
logMessages("Deleted all rule types, but we need atleast one Rule type, Here add default rule type");
19+
logMessage("All rule types were deleted, but we need at least one, so we add a default rule.");
2020
self.addRule(ruleTemplate);
2121
}
2222
};
@@ -26,7 +26,7 @@ jQuery(document).ready(function () {
2626
var context = ko.contextFor(event.target);
2727
self.eventsBindingList.splice(context.$index(), 1);
2828
if (self.eventsBindingList().length == 0) {
29-
logMessages("Deleted all events, but we need atleast one event.");
29+
logMessage("All events were deleted, but we need at least one, so we add an empty one.");
3030
self.addEvent({});
3131
}
3232
};
@@ -37,7 +37,7 @@ jQuery(document).ready(function () {
3737
try {
3838
array.push(JSON.parse(element.data()));
3939
} catch (e) {
40-
logMessages("Invalid json rule format :\n" + element.data());
40+
logMessage("Invalid json rule format :\n" + element.data());
4141
return false;
4242
}
4343
});
@@ -56,13 +56,6 @@ jQuery(document).ready(function () {
5656
$('#aggregatedObjectContent').text(JSON.stringify(responseData, null, 2));
5757
$('#aggregatedObjectModal').modal('show');
5858
}
59-
},
60-
error: function (XMLHttpRequest, textStatus, errorThrown) {
61-
if (XMLHttpRequest.responseText == "") {
62-
logMessages("Failed to generate the aggregated object, Error: Could not contact the backend server.");
63-
} else {
64-
logMessages("Failed to generate the aggregated object, Error: " + XMLHttpRequest.responseText);
65-
}
6659
}
6760
};
6861

@@ -127,7 +120,7 @@ jQuery(document).ready(function () {
127120
try {
128121
jsonLintResult = jsonlint.parse(fileContent);
129122
} catch (e) {
130-
logMessages("JSON events Format Check Failed:\n" + e.name + "\n" + e.message);
123+
logMessage("JSON events Format Check Failed:\n" + e.name + "\n" + e.message);
131124
return false;
132125
}
133126
$.jGrowl('JSON events Format Check Succeeded', {
@@ -241,15 +234,15 @@ jQuery(document).ready(function () {
241234
try {
242235
formRules.push(JSON.parse($(this).val()));
243236
} catch (e) {
244-
logMessages("Invalid json format :\n" + $(this).val());
237+
logMessage("Invalid json format :\n" + $(this).val());
245238
return false;
246239
}
247240
});
248241
if (formRules.length !== 0) {
249242
var jsonData = JSON.stringify(formRules, null, 2);
250243
downloadFile(jsonData, "application/json;charset=utf-8", "rules.json");
251244
} else {
252-
logMessages("Data not available for download!");
245+
logMessage("Data not available for download!");
253246
}
254247
});
255248

@@ -260,15 +253,15 @@ jQuery(document).ready(function () {
260253
try {
261254
formEvents.push(JSON.parse($(this).val()));
262255
} catch (e) {
263-
logMessages("Invalid json format :\n" + $(this).val());
256+
logMessage("Invalid json format :\n" + $(this).val());
264257
return false;
265258
}
266259
});
267260
if (formEvents.length !== 0) {
268261
var jsonData = JSON.stringify(formEvents, null, 2);
269262
downloadFile(jsonData, "application/json;charset=utf-8", "events.json");
270263
} else {
271-
logMessages("Data not available for download!");
264+
logMessage("Data not available for download!");
272265
}
273266
});
274267

@@ -279,7 +272,7 @@ jQuery(document).ready(function () {
279272
downloadFile(jsonString, "application/json;charset=utf-8", name + ".json");
280273
},
281274
error: function (XMLHttpRequest, textStatus, errorThrown) {
282-
logMessages("Failed to download template, Error: Could not contact the backend server.");
275+
logMessage("Failed to download template, Error: Could not contact the backend server.");
283276
}
284277
};
285278

0 commit comments

Comments
 (0)