diff --git a/frontend-js/src/main/js/gui/admin/ConfigurationAdminPanel.js b/frontend-js/src/main/js/gui/admin/ConfigurationAdminPanel.js index c2357d11fcf7df0234ec5282594c99f6a75ddd74..7c7fe4c9cd50d83ea20e24b2518511d96a2582ef 100644 --- a/frontend-js/src/main/js/gui/admin/ConfigurationAdminPanel.js +++ b/frontend-js/src/main/js/gui/admin/ConfigurationAdminPanel.js @@ -6,9 +6,11 @@ var ConfigurationType = require('../../ConfigurationType'); var Functions = require('../../Functions'); var GuiConnector = require('../../GuiConnector'); +var NetworkError = require('../../NetworkError'); var ValidationError = require('../../ValidationError'); var logger = require('../../logger'); +var HttpStatus = require('http-status-codes'); var Promise = require("bluebird"); var xss = require("xss"); @@ -253,9 +255,11 @@ ConfigurationAdminPanel.prototype.saveOption = function (type) { value = element.val(); } + var oldVal; GuiConnector.showProcessing(); return self.getServerConnector().getConfiguration().then(function (configuration) { option = configuration.getOption(type); + oldVal = option.getValue(); if (option === undefined) { return Promise.reject(new ValidationError("Unknown configuration type: " + type)); } @@ -317,7 +321,16 @@ ConfigurationAdminPanel.prototype.saveOption = function (type) { } }); } - }).catch(GuiConnector.alert).finally(GuiConnector.hideProcessing); + }).catch(function (e) { + if (e instanceof NetworkError && e.statusCode === HttpStatus.BAD_REQUEST) { + var content = e.content; + GuiConnector.alert(new ValidationError(content.reason)); + option.setValue(oldVal); + element.val(oldVal); + } else { + GuiConnector.alert(e); + } + }).finally(GuiConnector.hideProcessing); }; /** diff --git a/rest-api/src/main/java/lcsb/mapviewer/api/BaseController.java b/rest-api/src/main/java/lcsb/mapviewer/api/BaseController.java index 7bc7a6182d8300741589675c677f06342c3be029..68c9d13003cf879cc578b75285a8656fb1de9cbc 100644 --- a/rest-api/src/main/java/lcsb/mapviewer/api/BaseController.java +++ b/rest-api/src/main/java/lcsb/mapviewer/api/BaseController.java @@ -3,8 +3,9 @@ package lcsb.mapviewer.api; import java.io.IOException; import java.io.UnsupportedEncodingException; import java.net.URLDecoder; -import java.util.TreeMap; +import java.util.HashMap; import java.util.Map; +import java.util.TreeMap; import org.apache.log4j.Logger; import org.springframework.http.HttpHeaders; @@ -37,7 +38,8 @@ public abstract class BaseController { } else if (e instanceof ObjectExistsException) { return createErrorResponse("Object already exists.", e.getMessage(), new HttpHeaders(), HttpStatus.CONFLICT); } else if (e instanceof OperationNotAllowedException) { - return createErrorResponse("Operation not allowed.", e.getMessage(), new HttpHeaders(), HttpStatus.METHOD_NOT_ALLOWED); + return createErrorResponse("Operation not allowed.", e.getMessage(), new HttpHeaders(), + HttpStatus.METHOD_NOT_ALLOWED); } else if (e instanceof QueryException) { logger.error(e, e); return createErrorResponse("Query server error.", e.getMessage(), new HttpHeaders(), HttpStatus.BAD_REQUEST); @@ -53,8 +55,10 @@ public abstract class BaseController { private ResponseEntity<Object> createErrorResponse(String errorMessage, String error, HttpHeaders httpHeaders, HttpStatus status) { - return new ResponseEntity<Object>( - "{\"error\" : \"" + errorMessage + "\",\"reason\":" + new Gson().toJson(error) + "}", httpHeaders, status); + Map<String, String> response = new HashMap<>(); + response.put("error", errorMessage); + response.put("reason", error); + return new ResponseEntity<Object>(new Gson().toJson(response), httpHeaders, status); } public Map<String, Object> parseBody(String body) throws IOException, JsonParseException, JsonMappingException { diff --git a/rest-api/src/main/java/lcsb/mapviewer/api/configuration/ConfigurationRestImpl.java b/rest-api/src/main/java/lcsb/mapviewer/api/configuration/ConfigurationRestImpl.java index 326e146520f042e5f901211200d4c09a4576e18b..e956cad4a284812fe45d30d88be6fb94e7d8718a 100644 --- a/rest-api/src/main/java/lcsb/mapviewer/api/configuration/ConfigurationRestImpl.java +++ b/rest-api/src/main/java/lcsb/mapviewer/api/configuration/ConfigurationRestImpl.java @@ -293,7 +293,7 @@ public class ConfigurationRestImpl extends BaseRestImpl { try { configurationService.setConfigurationValue(type, value); } catch (InvalidArgumentException e) { - throw new QueryException(e); + throw new QueryException(e.getMessage(), e); } return optionToMap(configurationService.getValue(type)); }