Merge branch 'patch-1.0.2' into development

This commit is contained in:
anhefti 2020-07-16 16:17:30 +02:00
commit 265624ec4c
13 changed files with 60 additions and 14 deletions

View file

@ -200,7 +200,7 @@ public class APIMessage implements Serializable {
public static String toHTML(final String errorMessage, final List<APIMessage> messages) {
final StringBuilder builder = new StringBuilder();
builder.append("<b>Failure: </b>").append("<br/><br/>").append(errorMessage).append("<br/><br/>");
builder.append("<b>Failure:</b>").append("<br/><br/>").append(errorMessage).append("<br/><br/>");
builder.append("<b>Detail Messages:</b><br/><br/>");
return buildHTML(messages, builder);
}

View file

@ -330,6 +330,12 @@ public final class Utils {
: null;
}
public static String formatHTMLLinesForceEscaped(final String message) {
return (message != null)
? message.replace("\n", "<br/>").replace("\\n", "<br/>")
: null;
}
public static String formatLineBreaks(final String text) {
if (text == null) {
return null;

View file

@ -303,6 +303,11 @@ public class LmsSetupForm implements TemplateComposer {
.withEntityKey(entityKey)
.publishIf(() -> modifyGrant && readonly && institutionActive)
.newAction(ActionDefinition.LMS_SETUP_TEST)
.withEntityKey(entityKey)
.withExec(action -> LmsSetupForm.testLmsSetup(action, formHandle, restService))
.publishIf(() -> readonly)
.newAction(ActionDefinition.LMS_SETUP_DEACTIVATE)
.withEntityKey(entityKey)
.withSimpleRestCall(restService, DeactivateLmsSetup.class)
@ -320,6 +325,12 @@ public class LmsSetupForm implements TemplateComposer {
.ignoreMoveAwayFromEdit()
.publishIf(() -> !readonly)
.newAction(ActionDefinition.LMS_SETUP_TEST_EDIT)
.withEntityKey(entityKey)
.withExec(action -> this.testAdHoc(action, formHandle))
.ignoreMoveAwayFromEdit()
.publishIf(() -> !readonly && !isNew.getAsBoolean())
.newAction(ActionDefinition.LMS_SETUP_SAVE_AND_ACTIVATE)
.withEntityKey(entityKey)
.withExec(action -> {
@ -438,12 +449,12 @@ public class LmsSetupForm implements TemplateComposer {
case TOKEN_REQUEST: {
throw new PageMessageException(new LocTextKey(
"sebserver.lmssetup.action.test.tokenRequestError",
error.message));
Utils.formatHTMLLinesForceEscaped(Utils.escapeHTML_XML_EcmaScript(error.message))));
}
case QUIZ_ACCESS_API_REQUEST: {
throw new PageMessageException(new LocTextKey(
"sebserver.lmssetup.action.test.quizRequestError",
error.message));
Utils.formatHTMLLinesForceEscaped(Utils.escapeHTML_XML_EcmaScript(error.message))));
}
case QUIZ_RESTRICTION_API_REQUEST: {
// NOTE: quiz restriction is not mandatory for functional LmsSetup
@ -453,7 +464,7 @@ public class LmsSetupForm implements TemplateComposer {
default: {
throw new PageMessageException(new LocTextKey(
"sebserver.lmssetup.action.test.unknownError",
error.message));
Utils.formatHTMLLinesForceEscaped(Utils.escapeHTML_XML_EcmaScript(error.message))));
}
}
});

View file

@ -170,11 +170,16 @@ public enum ActionDefinition {
ImageIcon.EDIT,
PageStateDefinitionImpl.LMS_SETUP_EDIT,
ActionCategory.FORM),
LMS_SETUP_SAVE_AND_TEST(
new LocTextKey("sebserver.lmssetup.action.savetest"),
LMS_SETUP_TEST(
new LocTextKey("sebserver.lmssetup.action.test"),
ImageIcon.TEST,
PageStateDefinitionImpl.LMS_SETUP_VIEW,
ActionCategory.FORM),
LMS_SETUP_TEST_EDIT(
new LocTextKey("sebserver.lmssetup.action.test"),
ImageIcon.TEST,
PageStateDefinitionImpl.LMS_SETUP_EDIT,
ActionCategory.FORM),
LMS_SETUP_TEST_AND_SAVE(
new LocTextKey("sebserver.lmssetup.action.testsave"),
ImageIcon.TEST,

View file

@ -198,6 +198,13 @@ public final class PageAction {
PageAction.this.getName(),
e.getMessage(),
Utils.getErrorCauseMessage(e));
if (e.getCause() instanceof RestCallError) {
final RestCallError cause = (RestCallError) e.getCause();
PageAction.this.pageContext.notifyError(
PageContext.UNEXPECTED_ERROR_KEY,
cause);
return Result.ofError(cause);
}
return Result.ofError(e);
} catch (final Exception e) {
log.error("Failed to execute action: {} | error: {} | cause: {}",

View file

@ -258,7 +258,6 @@ public class PageContextImpl implements PageContext {
this.i18nSupport.getText(message),
SWT.NONE,
this.i18nSupport);
messageBox.setMarkupEnabled(true);
messageBox.open(null);
}
@ -303,6 +302,7 @@ public class PageContextImpl implements PageContext {
Utils.formatHTMLLines(errorMessage + "<br/><br/> Cause: " + error.getMessage()),
SWT.ERROR,
this.i18nSupport);
messageBox.setMarkupEnabled(true);
messageBox.open(null);
}

View file

@ -340,6 +340,8 @@ public class PageServiceImpl implements PageService {
} catch (final Exception e) {
log.error("Failed to set current PageState: ", e);
}
} else {
}
callback.accept(result);
});

View file

@ -37,7 +37,6 @@ public final class Message extends MessageBox {
super(parent, type);
super.setText(title);
super.setMessage(message);
super.setMarkupEnabled(true);
this.i18nSupport = i18nSupport;
}

View file

@ -150,8 +150,12 @@ public class LmsSetupDAOImpl implements LmsSetupDAO {
(lmsSetup.lmsType != null) ? lmsSetup.lmsType.name() : null,
lmsSetup.lmsApiUrl,
lmsCredentials.clientIdAsString(),
lmsCredentials.secretAsString(),
lmsCredentials.accessTokenAsString(),
(lmsCredentials.hasSecret())
? lmsCredentials.secretAsString()
: savedRecord.getLmsClientsecret(),
(lmsCredentials.hasAccessToken())
? lmsCredentials.accessTokenAsString()
: savedRecord.getLmsRestApiToken(),
lmsSetup.getProxyHost(),
lmsSetup.getProxyPort(),
proxyCredentials.clientIdAsString(),

View file

@ -86,6 +86,19 @@ public class APIExceptionHandler extends ResponseEntityExceptionHandler {
Utils.createJsonContentHeader(),
HttpStatus.BAD_REQUEST);
}
//
// @ExceptionHandler(RuntimeException.class)
// public ResponseEntity<Object> handleRuntimeException(
// final RuntimeException ex,
// final WebRequest request) {
//
// log.error("Unexpected generic error catched at the API endpoint: ", ex);
// final List<APIMessage> errors = Arrays.asList(APIMessage.ErrorMessage.GENERIC.of(ex.getMessage()));
// return new ResponseEntity<>(
// errors,
// Utils.createJsonContentHeader(),
// HttpStatus.INTERNAL_SERVER_ERROR);
// }
@ExceptionHandler(OnlyMessageLogExceptionWrapper.class)
public ResponseEntity<Object> onlyMessageLogExceptionWrapper(

View file

@ -308,7 +308,6 @@ public abstract class EntityController<T extends Entity, M extends Entity> {
consumes = MediaType.APPLICATION_JSON_UTF8_VALUE,
produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
public T savePut(@Valid @RequestBody final T modifyData) {
return this.checkModifyAccess(modifyData)
.flatMap(this::validForSave)
.flatMap(this.entityDAO::save)

View file

@ -293,10 +293,10 @@ sebserver.lmssetup.action.new=Add LMS Setup
sebserver.lmssetup.action.list.view=View LMS Setup
sebserver.lmssetup.action.list.modify=Edit LMS Setup
sebserver.lmssetup.action.modify=Edit
sebserver.lmssetup.action.savetest=Test And Save
sebserver.lmssetup.action.test=Test LMS Connection
sebserver.lmssetup.action.testsave=Test And Save
sebserver.lmssetup.action.test.ok=Successfully connected to the course API
sebserver.lmssetup.action.test.tokenRequestError=The API access was denied: {0}<br/>Please check the LMS connection details.
sebserver.lmssetup.action.test.tokenRequestError=The API access was denied:<br/>{0}<br/><br/>Please check the LMS connection details.
sebserver.lmssetup.action.test.quizRequestError=Unable to request courses or exams from the course API of the LMS. {0}
sebserver.lmssetup.action.test.quizRestrictionError=Unable to access course restriction API of the LMS. {0}
sebserver.lmssetup.action.test.missingParameter=There is one or more missing connection parameter.<br/>Please check the connection parameter for this LMS Setup

View file

@ -68,7 +68,7 @@ public class APIMessageTest {
final String html = APIMessage.toHTML("title message", messages);
assertEquals(
"<b>Failure: </b><br/><br/>title message<br/><br/><b>Detail Messages:</b><br/><br/>&nbsp;&nbsp;code&nbsp;:&nbsp;0<br/>&nbsp;&nbsp;system message&nbsp;:&nbsp;Generic error message<br/>&nbsp;&nbsp;details&nbsp;:&nbsp;--<br/><br/>&nbsp;&nbsp;code&nbsp;:&nbsp;1010<br/>&nbsp;&nbsp;system message&nbsp;:&nbsp;Illegal API request argument<br/>&nbsp;&nbsp;details&nbsp;:&nbsp;--<br/><br/>",
"<b>Failure:</b><br/><br/>title message<br/><br/><b>Detail Messages:</b><br/><br/>&nbsp;&nbsp;code&nbsp;:&nbsp;0<br/>&nbsp;&nbsp;system message&nbsp;:&nbsp;Generic error message<br/>&nbsp;&nbsp;details&nbsp;:&nbsp;--<br/><br/>&nbsp;&nbsp;code&nbsp;:&nbsp;1010<br/>&nbsp;&nbsp;system message&nbsp;:&nbsp;Illegal API request argument<br/>&nbsp;&nbsp;details&nbsp;:&nbsp;--<br/><br/>",
html);
final String html2 = APIMessage.toHTML(messages);