SEBSERV-72 implementation and config fixes
This commit is contained in:
parent
c96901472b
commit
2f29f14dc2
24 changed files with 606 additions and 135 deletions
|
@ -11,7 +11,6 @@ package ch.ethz.seb.sebserver;
|
|||
import java.io.File;
|
||||
import java.io.FileNotFoundException;
|
||||
import java.io.IOException;
|
||||
import java.net.HttpURLConnection;
|
||||
import java.security.KeyManagementException;
|
||||
import java.security.KeyStoreException;
|
||||
import java.security.NoSuchAlgorithmException;
|
||||
|
@ -39,7 +38,6 @@ import org.slf4j.LoggerFactory;
|
|||
import org.springframework.core.env.Environment;
|
||||
import org.springframework.http.client.ClientHttpRequestFactory;
|
||||
import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
|
||||
import org.springframework.http.client.SimpleClientHttpRequestFactory;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.util.CollectionUtils;
|
||||
import org.springframework.util.ResourceUtils;
|
||||
|
@ -95,11 +93,18 @@ public class ClientHttpRequestFactoryService {
|
|||
|
||||
final HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory();
|
||||
factory.setHttpClient(this.createProxiedClient(proxy, null));
|
||||
factory.setBufferRequestBody(false);
|
||||
return factory;
|
||||
|
||||
} else {
|
||||
final DevClientHttpRequestFactory devClientHttpRequestFactory = new DevClientHttpRequestFactory();
|
||||
devClientHttpRequestFactory.setOutputStreaming(false);
|
||||
final HttpComponentsClientHttpRequestFactory devClientHttpRequestFactory =
|
||||
new HttpComponentsClientHttpRequestFactory();
|
||||
|
||||
devClientHttpRequestFactory.setBufferRequestBody(false);
|
||||
|
||||
// final HttpClient httpClient = devClientHttpRequestFactory.getHttpClient();
|
||||
// httpClient.setInstanceFollowRedirects(false);
|
||||
// httpClient.setOutputStreaming(false);
|
||||
return devClientHttpRequestFactory;
|
||||
}
|
||||
}
|
||||
|
@ -204,17 +209,17 @@ public class ClientHttpRequestFactoryService {
|
|||
}
|
||||
|
||||
// TODO set connection and read timeout!? configurable!?
|
||||
private static class DevClientHttpRequestFactory extends SimpleClientHttpRequestFactory {
|
||||
|
||||
@Override
|
||||
protected void prepareConnection(
|
||||
final HttpURLConnection connection,
|
||||
final String httpMethod) throws IOException {
|
||||
|
||||
super.prepareConnection(connection, httpMethod);
|
||||
super.setBufferRequestBody(false);
|
||||
connection.setInstanceFollowRedirects(false);
|
||||
}
|
||||
}
|
||||
// private static class DevClientHttpRequestFactory extends HttpComponentsClientHttpRequestFactory {
|
||||
//
|
||||
// @Override
|
||||
// protected void prepareConnection(
|
||||
// final HttpURLConnection connection,
|
||||
// final String httpMethod) throws IOException {
|
||||
//
|
||||
// super.prepareConnection(connection, httpMethod);
|
||||
// super.setBufferRequestBody(false);
|
||||
// connection.setInstanceFollowRedirects(false);
|
||||
// }
|
||||
// }
|
||||
|
||||
}
|
||||
|
|
|
@ -27,6 +27,7 @@ public final class API {
|
|||
public static final String PARAM_ENTITY_TYPE = "entityType";
|
||||
public static final String PARAM_BULK_ACTION_TYPE = "bulkActionType";
|
||||
public static final String PARAM_CLIENT_CONFIG_SECRET = "client_config_secret";
|
||||
public static final String PARAM_VIEW_ID = "viewId";
|
||||
public static final String DEFAULT_CONFIG_TEMPLATE_ID = String.valueOf(ConfigurationNode.DEFAULT_TEMPLATE_ID);
|
||||
|
||||
public static final String INSTITUTION_VAR_PATH_SEGMENT = "/{" + PARAM_INSTITUTION_ID + "}";
|
||||
|
@ -128,6 +129,9 @@ public final class API {
|
|||
public static final String IMPORT_FILE_ATTR_NAME = "importFile";
|
||||
|
||||
public static final String TEMPLATE_ATTRIBUTE_ENDPOINT = "/template-attribute";
|
||||
public static final String TEMPLATE_ATTRIBUTE_RESET_VALUES = "/reset";
|
||||
public static final String TEMPLATE_ATTRIBUTE_REMOVE_ORIENTATION = "remove-orientation";
|
||||
public static final String TEMPLATE_ATTRIBUTE_ATTACH_DEFAUL_ORIENTATION = "attach-default-orientation";
|
||||
|
||||
public static final String ORIENTATION_ENDPOINT = "/orientation";
|
||||
public static final String VIEW_ENDPOINT = ORIENTATION_ENDPOINT + "/view";
|
||||
|
|
|
@ -23,6 +23,7 @@ import ch.ethz.seb.sebserver.gbl.model.Entity;
|
|||
@JsonIgnoreProperties(ignoreUnknown = true)
|
||||
public final class Orientation implements Entity {
|
||||
|
||||
public static final String FILTER_ATTR_ATTRIBUTE_ID = "attributeId";
|
||||
public static final String FILTER_ATTR_TEMPLATE_ID = "templateId";
|
||||
public static final String FILTER_ATTR_VIEW_ID = "viewId";
|
||||
public static final String FILTER_ATTR_GROUP_ID = "groupId";
|
||||
|
|
|
@ -10,6 +10,9 @@ package ch.ethz.seb.sebserver.gui.content;
|
|||
|
||||
import java.util.Arrays;
|
||||
|
||||
import org.eclipse.swt.SWT;
|
||||
import org.eclipse.swt.layout.GridData;
|
||||
import org.eclipse.swt.layout.GridLayout;
|
||||
import org.eclipse.swt.widgets.Composite;
|
||||
import org.springframework.context.annotation.Lazy;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
@ -36,13 +39,13 @@ import ch.ethz.seb.sebserver.gui.service.examconfig.impl.ViewContext;
|
|||
import ch.ethz.seb.sebserver.gui.service.i18n.LocTextKey;
|
||||
import ch.ethz.seb.sebserver.gui.service.page.PageContext;
|
||||
import ch.ethz.seb.sebserver.gui.service.page.PageService;
|
||||
import ch.ethz.seb.sebserver.gui.service.page.PageService.PageActionBuilder;
|
||||
import ch.ethz.seb.sebserver.gui.service.page.TemplateComposer;
|
||||
import ch.ethz.seb.sebserver.gui.service.remote.webservice.api.RestService;
|
||||
import ch.ethz.seb.sebserver.gui.service.remote.webservice.api.seb.examconfig.GetConfigurations;
|
||||
import ch.ethz.seb.sebserver.gui.service.remote.webservice.api.seb.examconfig.GetTemplateAttribute;
|
||||
import ch.ethz.seb.sebserver.gui.service.remote.webservice.auth.CurrentUser;
|
||||
import ch.ethz.seb.sebserver.gui.widget.WidgetFactory;
|
||||
import ch.ethz.seb.sebserver.gui.widget.WidgetFactory.CustomVariant;
|
||||
|
||||
@Lazy
|
||||
@Component
|
||||
|
@ -142,10 +145,17 @@ public class ConfigTemplateAttributeForm implements TemplateComposer {
|
|||
attribute.getGroupId()))
|
||||
.build();
|
||||
|
||||
widgetFactory.labelLocalizedTitle(
|
||||
widgetFactory.labelLocalized(
|
||||
content,
|
||||
CustomVariant.TEXT_H2,
|
||||
FORM_VALUE_TEXT_KEY);
|
||||
|
||||
final Composite grid = new Composite(content, SWT.NONE);
|
||||
grid.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false));
|
||||
grid.setLayout(new GridLayout(6, true));
|
||||
|
||||
final PageContext valueContext = formContext.copyOf(grid);
|
||||
|
||||
final InputFieldBuilder inputFieldBuilder = this.examConfigurationService.getInputFieldBuilder(
|
||||
attribute.getConfigAttribute(),
|
||||
attribute.getOrientation());
|
||||
|
@ -154,7 +164,7 @@ public class ConfigTemplateAttributeForm implements TemplateComposer {
|
|||
.getOrThrow();
|
||||
|
||||
final ViewContext viewContext = this.examConfigurationService.createViewContext(
|
||||
formContext,
|
||||
valueContext,
|
||||
configuration,
|
||||
new View(-1L, "template", 10, 0, templateId),
|
||||
attributeMapping,
|
||||
|
@ -171,9 +181,7 @@ public class ConfigTemplateAttributeForm implements TemplateComposer {
|
|||
configuration.id,
|
||||
Arrays.asList(viewContext));
|
||||
|
||||
final PageActionBuilder pageActionBuilder = this.pageService
|
||||
.pageActionBuilder(formContext.clearEntityKeys());
|
||||
pageActionBuilder
|
||||
this.pageService.pageActionBuilder(formContext.clearEntityKeys())
|
||||
|
||||
.newAction(ActionDefinition.SEB_EXAM_CONFIG_TEMPLATE_ATTR_FORM_SET_DEFAULT)
|
||||
.withEntityKey(attributeKey)
|
||||
|
|
|
@ -282,7 +282,7 @@ public class ConfigTemplateForm implements TemplateComposer {
|
|||
final PageAction action,
|
||||
final EntityTable<TemplateAttribute> attrTable) {
|
||||
|
||||
final PageAction removeFormView = this.examConfigurationService.removeFormView(action);
|
||||
final PageAction removeFormView = this.examConfigurationService.removeFromView(action);
|
||||
// reload the list
|
||||
attrTable.applyFilter();
|
||||
return removeFormView;
|
||||
|
|
|
@ -61,7 +61,9 @@ public interface ExamConfigurationService {
|
|||
|
||||
PageAction resetToDefaults(PageAction action);
|
||||
|
||||
PageAction removeFormView(PageAction action);
|
||||
PageAction removeFromView(PageAction action);
|
||||
|
||||
PageAction attachToDefaultView(final PageAction action);
|
||||
|
||||
static String attributeNameKey(final ConfigurationAttribute attribute) {
|
||||
if (attribute == null) {
|
||||
|
|
|
@ -11,6 +11,7 @@ package ch.ethz.seb.sebserver.gui.service.examconfig.impl;
|
|||
import java.util.Collection;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import org.apache.tomcat.util.buf.StringUtils;
|
||||
|
@ -46,12 +47,16 @@ import ch.ethz.seb.sebserver.gui.service.i18n.LocTextKey;
|
|||
import ch.ethz.seb.sebserver.gui.service.page.FieldValidationError;
|
||||
import ch.ethz.seb.sebserver.gui.service.page.PageContext;
|
||||
import ch.ethz.seb.sebserver.gui.service.page.impl.PageAction;
|
||||
import ch.ethz.seb.sebserver.gui.service.remote.webservice.api.RestCall;
|
||||
import ch.ethz.seb.sebserver.gui.service.remote.webservice.api.RestCallError;
|
||||
import ch.ethz.seb.sebserver.gui.service.remote.webservice.api.RestService;
|
||||
import ch.ethz.seb.sebserver.gui.service.remote.webservice.api.seb.examconfig.AttchDefaultOrientation;
|
||||
import ch.ethz.seb.sebserver.gui.service.remote.webservice.api.seb.examconfig.GetConfigAttributes;
|
||||
import ch.ethz.seb.sebserver.gui.service.remote.webservice.api.seb.examconfig.GetConfigurationValues;
|
||||
import ch.ethz.seb.sebserver.gui.service.remote.webservice.api.seb.examconfig.GetOrientations;
|
||||
import ch.ethz.seb.sebserver.gui.service.remote.webservice.api.seb.examconfig.GetViewList;
|
||||
import ch.ethz.seb.sebserver.gui.service.remote.webservice.api.seb.examconfig.RemoveOrientation;
|
||||
import ch.ethz.seb.sebserver.gui.service.remote.webservice.api.seb.examconfig.ResetTemplateValues;
|
||||
import ch.ethz.seb.sebserver.gui.service.remote.webservice.api.seb.examconfig.SaveExamConfigTableValues;
|
||||
import ch.ethz.seb.sebserver.gui.service.remote.webservice.api.seb.examconfig.SaveExamConfigValue;
|
||||
import ch.ethz.seb.sebserver.gui.widget.WidgetFactory;
|
||||
|
@ -213,21 +218,82 @@ public class ExamConfigurationServiceImpl implements ExamConfigurationService {
|
|||
|
||||
@Override
|
||||
public final PageAction resetToDefaults(final PageAction action) {
|
||||
final EntityKey singleSelection = action.getSingleSelection();
|
||||
final EntityKey parentEntityKey = action.pageContext().getParentEntityKey();
|
||||
final Set<EntityKey> selection = action.getMultiSelection();
|
||||
if (selection != null && !selection.isEmpty()) {
|
||||
selection.stream().forEach(entityKey -> {
|
||||
callTemplateAction(
|
||||
ResetTemplateValues.class,
|
||||
parentEntityKey.modelId,
|
||||
entityKey.modelId);
|
||||
});
|
||||
} else {
|
||||
final EntityKey entityKey = action.getEntityKey();
|
||||
callTemplateAction(
|
||||
ResetTemplateValues.class,
|
||||
parentEntityKey.modelId,
|
||||
entityKey.modelId);
|
||||
}
|
||||
|
||||
// TODO
|
||||
return action;
|
||||
}
|
||||
|
||||
@Override
|
||||
public final PageAction removeFormView(final PageAction action) {
|
||||
final EntityKey singleSelection = action.getSingleSelection();
|
||||
|
||||
// TODO
|
||||
public final PageAction removeFromView(final PageAction action) {
|
||||
final EntityKey parentEntityKey = action.pageContext().getParentEntityKey();
|
||||
final Set<EntityKey> selection = action.getMultiSelection();
|
||||
if (selection != null && !selection.isEmpty()) {
|
||||
selection.stream().forEach(entityKey -> {
|
||||
callTemplateAction(
|
||||
RemoveOrientation.class,
|
||||
parentEntityKey.modelId,
|
||||
entityKey.modelId);
|
||||
});
|
||||
} else {
|
||||
final EntityKey entityKey = action.getEntityKey();
|
||||
callTemplateAction(
|
||||
RemoveOrientation.class,
|
||||
parentEntityKey.modelId,
|
||||
entityKey.modelId);
|
||||
}
|
||||
|
||||
return action;
|
||||
}
|
||||
|
||||
@Override
|
||||
public final PageAction attachToDefaultView(final PageAction action) {
|
||||
final EntityKey parentEntityKey = action.pageContext().getParentEntityKey();
|
||||
final Set<EntityKey> selection = action.getMultiSelection();
|
||||
if (selection != null && !selection.isEmpty()) {
|
||||
selection.stream().forEach(entityKey -> {
|
||||
callTemplateAction(
|
||||
AttchDefaultOrientation.class,
|
||||
parentEntityKey.modelId,
|
||||
entityKey.modelId);
|
||||
});
|
||||
} else {
|
||||
final EntityKey entityKey = action.getEntityKey();
|
||||
callTemplateAction(
|
||||
AttchDefaultOrientation.class,
|
||||
parentEntityKey.modelId,
|
||||
entityKey.modelId);
|
||||
}
|
||||
|
||||
return action;
|
||||
}
|
||||
|
||||
private void callTemplateAction(
|
||||
final Class<? extends RestCall<?>> actionType,
|
||||
final String templateId,
|
||||
final String attributeId) {
|
||||
|
||||
this.restService.getBuilder(actionType)
|
||||
.withURIVariable(API.PARAM_PARENT_MODEL_ID, templateId)
|
||||
.withURIVariable(API.PARAM_MODEL_ID, attributeId)
|
||||
.call()
|
||||
.getOrThrow();
|
||||
}
|
||||
|
||||
private static final class ValueChangeListenerImpl implements ValueChangeListener {
|
||||
|
||||
public static final String VALIDATION_ERROR_KEY_PREFIX = "sebserver.examconfig.props.validation.";
|
||||
|
|
|
@ -0,0 +1,44 @@
|
|||
/*
|
||||
* Copyright (c) 2019 ETH Zürich, Educational Development and Technology (LET)
|
||||
*
|
||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||
*/
|
||||
|
||||
package ch.ethz.seb.sebserver.gui.service.remote.webservice.api.seb.examconfig;
|
||||
|
||||
import org.springframework.context.annotation.Lazy;
|
||||
import org.springframework.http.HttpMethod;
|
||||
import org.springframework.http.MediaType;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
import com.fasterxml.jackson.core.type.TypeReference;
|
||||
|
||||
import ch.ethz.seb.sebserver.gbl.api.API;
|
||||
import ch.ethz.seb.sebserver.gbl.api.EntityType;
|
||||
import ch.ethz.seb.sebserver.gbl.model.sebconfig.TemplateAttribute;
|
||||
import ch.ethz.seb.sebserver.gbl.profile.GuiProfile;
|
||||
import ch.ethz.seb.sebserver.gui.service.remote.webservice.api.RestCall;
|
||||
|
||||
@Lazy
|
||||
@Component
|
||||
@GuiProfile
|
||||
public class AttchDefaultOrientation extends RestCall<TemplateAttribute> {
|
||||
|
||||
public AttchDefaultOrientation() {
|
||||
super(new TypeKey<>(
|
||||
CallType.SAVE,
|
||||
EntityType.CONFIGURATION_NODE,
|
||||
new TypeReference<TemplateAttribute>() {
|
||||
}),
|
||||
HttpMethod.PATCH,
|
||||
MediaType.APPLICATION_FORM_URLENCODED,
|
||||
API.CONFIGURATION_NODE_ENDPOINT
|
||||
+ API.PARENT_MODEL_ID_VAR_PATH_SEGMENT
|
||||
+ API.TEMPLATE_ATTRIBUTE_ENDPOINT
|
||||
+ API.MODEL_ID_VAR_PATH_SEGMENT
|
||||
+ API.TEMPLATE_ATTRIBUTE_ATTACH_DEFAUL_ORIENTATION);
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,44 @@
|
|||
/*
|
||||
* Copyright (c) 2019 ETH Zürich, Educational Development and Technology (LET)
|
||||
*
|
||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||
*/
|
||||
|
||||
package ch.ethz.seb.sebserver.gui.service.remote.webservice.api.seb.examconfig;
|
||||
|
||||
import org.springframework.context.annotation.Lazy;
|
||||
import org.springframework.http.HttpMethod;
|
||||
import org.springframework.http.MediaType;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
import com.fasterxml.jackson.core.type.TypeReference;
|
||||
|
||||
import ch.ethz.seb.sebserver.gbl.api.API;
|
||||
import ch.ethz.seb.sebserver.gbl.api.EntityType;
|
||||
import ch.ethz.seb.sebserver.gbl.model.sebconfig.TemplateAttribute;
|
||||
import ch.ethz.seb.sebserver.gbl.profile.GuiProfile;
|
||||
import ch.ethz.seb.sebserver.gui.service.remote.webservice.api.RestCall;
|
||||
|
||||
@Lazy
|
||||
@Component
|
||||
@GuiProfile
|
||||
public class RemoveOrientation extends RestCall<TemplateAttribute> {
|
||||
|
||||
public RemoveOrientation() {
|
||||
super(new TypeKey<>(
|
||||
CallType.SAVE,
|
||||
EntityType.CONFIGURATION_NODE,
|
||||
new TypeReference<TemplateAttribute>() {
|
||||
}),
|
||||
HttpMethod.PATCH,
|
||||
MediaType.APPLICATION_FORM_URLENCODED,
|
||||
API.CONFIGURATION_NODE_ENDPOINT
|
||||
+ API.PARENT_MODEL_ID_VAR_PATH_SEGMENT
|
||||
+ API.TEMPLATE_ATTRIBUTE_ENDPOINT
|
||||
+ API.MODEL_ID_VAR_PATH_SEGMENT
|
||||
+ API.TEMPLATE_ATTRIBUTE_REMOVE_ORIENTATION);
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,44 @@
|
|||
/*
|
||||
* Copyright (c) 2019 ETH Zürich, Educational Development and Technology (LET)
|
||||
*
|
||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||
*/
|
||||
|
||||
package ch.ethz.seb.sebserver.gui.service.remote.webservice.api.seb.examconfig;
|
||||
|
||||
import org.springframework.context.annotation.Lazy;
|
||||
import org.springframework.http.HttpMethod;
|
||||
import org.springframework.http.MediaType;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
import com.fasterxml.jackson.core.type.TypeReference;
|
||||
|
||||
import ch.ethz.seb.sebserver.gbl.api.API;
|
||||
import ch.ethz.seb.sebserver.gbl.api.EntityType;
|
||||
import ch.ethz.seb.sebserver.gbl.model.sebconfig.TemplateAttribute;
|
||||
import ch.ethz.seb.sebserver.gbl.profile.GuiProfile;
|
||||
import ch.ethz.seb.sebserver.gui.service.remote.webservice.api.RestCall;
|
||||
|
||||
@Lazy
|
||||
@Component
|
||||
@GuiProfile
|
||||
public class ResetTemplateValues extends RestCall<TemplateAttribute> {
|
||||
|
||||
public ResetTemplateValues() {
|
||||
super(new TypeKey<>(
|
||||
CallType.SAVE,
|
||||
EntityType.CONFIGURATION_NODE,
|
||||
new TypeReference<TemplateAttribute>() {
|
||||
}),
|
||||
HttpMethod.PATCH,
|
||||
MediaType.APPLICATION_FORM_URLENCODED,
|
||||
API.CONFIGURATION_NODE_ENDPOINT
|
||||
+ API.PARENT_MODEL_ID_VAR_PATH_SEGMENT
|
||||
+ API.TEMPLATE_ATTRIBUTE_ENDPOINT
|
||||
+ API.MODEL_ID_VAR_PATH_SEGMENT
|
||||
+ API.TEMPLATE_ATTRIBUTE_RESET_VALUES);
|
||||
}
|
||||
|
||||
}
|
|
@ -36,6 +36,7 @@ public class WebserviceInfo {
|
|||
private static final String WEB_SERVICE_TEST_PROPERTY = "sebserver.test.property";
|
||||
private static final String WEB_SERVICE_SERVER_NAME_KEY = "sebserver.webservice.http.server.name";
|
||||
private static final String WEB_SERVICE_HTTP_SCHEME_KEY = "sebserver.webservice.http.scheme";
|
||||
private static final String WEB_SERVICE_HTTP_PORT = "sebserver.webservice.http.port";
|
||||
private static final String WEB_SERVICE_HOST_ADDRESS_KEY = "server.address";
|
||||
private static final String WEB_SERVICE_SERVER_PORT_KEY = "server.port";
|
||||
private static final String WEB_SERVICE_EXAM_API_DISCOVERY_ENDPOINT_KEY =
|
||||
|
@ -45,8 +46,9 @@ public class WebserviceInfo {
|
|||
private final String testProperty;
|
||||
private final String httpScheme;
|
||||
private final String hostAddress; // internal
|
||||
private final String serverName; // external
|
||||
private final String serverPort;
|
||||
private final String webserverName; // external
|
||||
private final String serverPort; // internal
|
||||
private final String webserverPort; // external
|
||||
private final String discoveryEndpoint;
|
||||
|
||||
private final String serverURLPrefix;
|
||||
|
@ -58,17 +60,21 @@ public class WebserviceInfo {
|
|||
this.testProperty = environment.getProperty(WEB_SERVICE_TEST_PROPERTY, "NOT_AVAILABLE");
|
||||
this.httpScheme = environment.getRequiredProperty(WEB_SERVICE_HTTP_SCHEME_KEY);
|
||||
this.hostAddress = environment.getRequiredProperty(WEB_SERVICE_HOST_ADDRESS_KEY);
|
||||
this.serverName = environment.getProperty(WEB_SERVICE_SERVER_NAME_KEY, "");
|
||||
this.webserverName = environment.getProperty(WEB_SERVICE_SERVER_NAME_KEY, "");
|
||||
this.serverPort = environment.getRequiredProperty(WEB_SERVICE_SERVER_PORT_KEY);
|
||||
this.webserverPort = environment.getProperty(WEB_SERVICE_HTTP_PORT);
|
||||
this.discoveryEndpoint = environment.getRequiredProperty(WEB_SERVICE_EXAM_API_DISCOVERY_ENDPOINT_KEY);
|
||||
|
||||
this.serverURLPrefix = UriComponentsBuilder.newInstance()
|
||||
final UriComponentsBuilder builder = UriComponentsBuilder.newInstance()
|
||||
.scheme(this.httpScheme)
|
||||
.host((StringUtils.isNotBlank(this.serverName))
|
||||
? this.serverName
|
||||
: this.hostAddress)
|
||||
.port(this.serverPort)
|
||||
.toUriString();
|
||||
.host((StringUtils.isNotBlank(this.webserverName))
|
||||
? this.webserverName
|
||||
: this.hostAddress);
|
||||
if (StringUtils.isNotBlank(this.webserverPort)) {
|
||||
builder.port(this.webserverPort);
|
||||
}
|
||||
|
||||
this.serverURLPrefix = builder.toUriString();
|
||||
|
||||
this.isDistributed = BooleanUtils.toBoolean(environment.getProperty(
|
||||
"sebserver.webservice.distributed",
|
||||
|
@ -106,14 +112,18 @@ public class WebserviceInfo {
|
|||
return this.hostAddress;
|
||||
}
|
||||
|
||||
public String getServerName() {
|
||||
return this.serverName;
|
||||
public String getWebserviceDomainName() {
|
||||
return this.webserverName;
|
||||
}
|
||||
|
||||
public String getServerPort() {
|
||||
return this.serverPort;
|
||||
}
|
||||
|
||||
public String getServerExternalPort() {
|
||||
return this.webserverPort;
|
||||
}
|
||||
|
||||
public String getDiscoveryEndpoint() {
|
||||
return this.discoveryEndpoint;
|
||||
}
|
||||
|
@ -183,18 +193,20 @@ public class WebserviceInfo {
|
|||
builder.append(this.httpScheme);
|
||||
builder.append(", hostAddress=");
|
||||
builder.append(this.hostAddress);
|
||||
builder.append(", serverName=");
|
||||
builder.append(this.serverName);
|
||||
builder.append(", webserverName=");
|
||||
builder.append(this.webserverName);
|
||||
builder.append(", serverPort=");
|
||||
builder.append(this.serverPort);
|
||||
builder.append(", webserverPort=");
|
||||
builder.append(this.webserverPort);
|
||||
builder.append(", discoveryEndpoint=");
|
||||
builder.append(this.discoveryEndpoint);
|
||||
builder.append(", externalAddressAlias=");
|
||||
builder.append(this.externalAddressAlias);
|
||||
builder.append(", serverURLPrefix=");
|
||||
builder.append(this.serverURLPrefix);
|
||||
builder.append(", isDistributed=");
|
||||
builder.append(this.isDistributed);
|
||||
builder.append(", externalAddressAlias=");
|
||||
builder.append(this.externalAddressAlias);
|
||||
builder.append("]");
|
||||
return builder.toString();
|
||||
}
|
||||
|
|
|
@ -8,6 +8,8 @@
|
|||
|
||||
package ch.ethz.seb.sebserver.webservice.servicelayer.dao;
|
||||
|
||||
import java.util.Arrays;
|
||||
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.joda.time.DateTime;
|
||||
import org.springframework.util.LinkedMultiValueMap;
|
||||
|
@ -119,6 +121,10 @@ public class FilterMap extends POSTMapper {
|
|||
return getLong(Orientation.FILTER_ATTR_TEMPLATE_ID);
|
||||
}
|
||||
|
||||
public Long getOrientationAttributeId() {
|
||||
return getLong(Orientation.FILTER_ATTR_ATTRIBUTE_ID);
|
||||
}
|
||||
|
||||
public Long getOrientationViewId() {
|
||||
return getLong(Orientation.FILTER_ATTR_VIEW_ID);
|
||||
}
|
||||
|
@ -284,4 +290,23 @@ public class FilterMap extends POSTMapper {
|
|||
return null;
|
||||
}
|
||||
|
||||
public static final class Builder {
|
||||
|
||||
private final FilterMap filterMap = new FilterMap();
|
||||
|
||||
public Builder add(final String name, final String value) {
|
||||
this.filterMap.params.add(name, value);
|
||||
return this;
|
||||
}
|
||||
|
||||
public Builder put(final String name, final String value) {
|
||||
this.filterMap.params.put(name, Arrays.asList(value));
|
||||
return this;
|
||||
}
|
||||
|
||||
public FilterMap create() {
|
||||
return new FilterMap(this.filterMap.params);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -8,6 +8,7 @@
|
|||
|
||||
package ch.ethz.seb.sebserver.webservice.servicelayer.dao;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import ch.ethz.seb.sebserver.gbl.model.sebconfig.ConfigurationNode;
|
||||
|
@ -18,4 +19,8 @@ public interface ViewDAO extends EntityDAO<View, View> {
|
|||
|
||||
Result<Map<Long, Long>> copyDefaultViewsForTemplate(ConfigurationNode node);
|
||||
|
||||
Result<List<View>> getDefaultTemplateViews();
|
||||
|
||||
Result<View> getDefaultViewForTemplate(Long templateId, Long defaultViewId);
|
||||
|
||||
}
|
||||
|
|
|
@ -91,6 +91,9 @@ public class OrientationDAOImpl implements OrientationDAO {
|
|||
.where(
|
||||
OrientationRecordDynamicSqlSupport.templateId,
|
||||
SqlBuilder.isEqualToWhenPresent(filterMap.getOrientationTemplateId()))
|
||||
.and(
|
||||
OrientationRecordDynamicSqlSupport.configAttributeId,
|
||||
SqlBuilder.isEqualToWhenPresent(filterMap.getOrientationAttributeId()))
|
||||
.and(
|
||||
OrientationRecordDynamicSqlSupport.viewId,
|
||||
SqlBuilder.isEqualToWhenPresent(filterMap.getOrientationViewId()))
|
||||
|
|
|
@ -100,6 +100,47 @@ public class ViewDAOImpl implements ViewDAO {
|
|||
.collect(Collectors.toList()));
|
||||
}
|
||||
|
||||
@Override
|
||||
@Transactional(readOnly = true)
|
||||
public Result<List<View>> getDefaultTemplateViews() {
|
||||
return Result.tryCatch(() -> this.viewRecordMapper
|
||||
.selectByExample()
|
||||
.where(
|
||||
ViewRecordDynamicSqlSupport.templateId,
|
||||
SqlBuilder.isEqualTo(ConfigurationNode.DEFAULT_TEMPLATE_ID))
|
||||
.build()
|
||||
.execute()
|
||||
.stream()
|
||||
.map(ViewDAOImpl::toDomainModel)
|
||||
.flatMap(DAOLoggingSupport::logAndSkipOnError)
|
||||
.collect(Collectors.toList()));
|
||||
}
|
||||
|
||||
@Override
|
||||
@Transactional(readOnly = true)
|
||||
public Result<View> getDefaultViewForTemplate(final Long templateId, final Long defaultViewId) {
|
||||
return Result.tryCatch(() -> {
|
||||
// get all views of template
|
||||
final List<ViewRecord> templateViews = this.viewRecordMapper
|
||||
.selectByExample()
|
||||
.where(
|
||||
ViewRecordDynamicSqlSupport.templateId,
|
||||
SqlBuilder.isEqualTo(templateId))
|
||||
.build()
|
||||
.execute();
|
||||
// get default view
|
||||
final ViewRecord defView = this.viewRecordMapper.selectByPrimaryKey(defaultViewId);
|
||||
final ViewRecord result = templateViews
|
||||
.stream()
|
||||
.filter(view -> view.getName().equals(defView.getName()))
|
||||
.findFirst()
|
||||
.orElseThrow();
|
||||
|
||||
return result;
|
||||
})
|
||||
.flatMap(ViewDAOImpl::toDomainModel);
|
||||
}
|
||||
|
||||
@Override
|
||||
@Transactional
|
||||
public Result<View> createNew(final View data) {
|
||||
|
|
|
@ -9,9 +9,7 @@
|
|||
package ch.ethz.seb.sebserver.webservice.servicelayer.sebconfig;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
|
||||
import ch.ethz.seb.sebserver.gbl.model.EntityKey;
|
||||
import ch.ethz.seb.sebserver.gbl.model.sebconfig.TemplateAttribute;
|
||||
import ch.ethz.seb.sebserver.gbl.util.Result;
|
||||
import ch.ethz.seb.sebserver.webservice.servicelayer.dao.FilterMap;
|
||||
|
@ -29,9 +27,20 @@ public interface SebExamConfigTemplateService {
|
|||
final Long templateId,
|
||||
final Long attributeId);
|
||||
|
||||
Result<Set<EntityKey>> setDefaultValues(
|
||||
Result<TemplateAttribute> setDefaultValues(
|
||||
final Long institutionId,
|
||||
final Long templateId,
|
||||
final Long attributeId);
|
||||
|
||||
Result<TemplateAttribute> removeOrientation(
|
||||
final Long institutionId,
|
||||
final Long templateId,
|
||||
final Long attributeId);
|
||||
|
||||
Result<TemplateAttribute> attachDefaultOrientation(
|
||||
final Long institutionId,
|
||||
final Long templateId,
|
||||
final Long attributeId,
|
||||
Long viewId);
|
||||
|
||||
}
|
||||
|
|
|
@ -8,33 +8,34 @@
|
|||
|
||||
package ch.ethz.seb.sebserver.webservice.servicelayer.sebconfig.impl;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.Collections;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.function.Function;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import org.springframework.context.annotation.Lazy;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import ch.ethz.seb.sebserver.gbl.model.Domain;
|
||||
import ch.ethz.seb.sebserver.gbl.model.EntityKey;
|
||||
import ch.ethz.seb.sebserver.gbl.model.PageSortOrder;
|
||||
import ch.ethz.seb.sebserver.gbl.model.sebconfig.ConfigurationAttribute;
|
||||
import ch.ethz.seb.sebserver.gbl.model.sebconfig.ConfigurationNode;
|
||||
import ch.ethz.seb.sebserver.gbl.model.sebconfig.Orientation;
|
||||
import ch.ethz.seb.sebserver.gbl.model.sebconfig.TemplateAttribute;
|
||||
import ch.ethz.seb.sebserver.gbl.profile.WebServiceProfile;
|
||||
import ch.ethz.seb.sebserver.gbl.util.Result;
|
||||
import ch.ethz.seb.sebserver.webservice.servicelayer.dao.ConfigurationAttributeDAO;
|
||||
import ch.ethz.seb.sebserver.webservice.servicelayer.dao.ConfigurationDAO;
|
||||
import ch.ethz.seb.sebserver.webservice.servicelayer.dao.ConfigurationNodeDAO;
|
||||
import ch.ethz.seb.sebserver.webservice.servicelayer.dao.ConfigurationValueDAO;
|
||||
import ch.ethz.seb.sebserver.webservice.servicelayer.dao.FilterMap;
|
||||
import ch.ethz.seb.sebserver.webservice.servicelayer.dao.OrientationDAO;
|
||||
import ch.ethz.seb.sebserver.webservice.servicelayer.dao.ViewDAO;
|
||||
import ch.ethz.seb.sebserver.webservice.servicelayer.sebconfig.SebExamConfigService;
|
||||
import ch.ethz.seb.sebserver.webservice.servicelayer.sebconfig.SebExamConfigTemplateService;
|
||||
|
||||
@Lazy
|
||||
|
@ -42,28 +43,26 @@ import ch.ethz.seb.sebserver.webservice.servicelayer.sebconfig.SebExamConfigTemp
|
|||
@WebServiceProfile
|
||||
public class SebExamConfigTemplateServiceImpl implements SebExamConfigTemplateService {
|
||||
|
||||
private final ConfigurationNodeDAO ConfigurationNodeDAO;
|
||||
private final ConfigurationDAO configurationDAO;
|
||||
private static final Logger log = LoggerFactory.getLogger(SebExamConfigTemplateServiceImpl.class);
|
||||
|
||||
private final ViewDAO viewDAO;
|
||||
private final ConfigurationDAO configurationDAO;
|
||||
private final OrientationDAO orientationDAO;
|
||||
private final ConfigurationAttributeDAO configurationAttributeDAO;
|
||||
private final ConfigurationValueDAO configurationValueDAO;
|
||||
private final SebExamConfigService sebExamConfigService;
|
||||
|
||||
protected SebExamConfigTemplateServiceImpl(
|
||||
final ch.ethz.seb.sebserver.webservice.servicelayer.dao.ConfigurationNodeDAO configurationNodeDAO,
|
||||
final ConfigurationDAO configurationDAO, final ViewDAO viewDAO, final OrientationDAO orientationDAO,
|
||||
final ViewDAO viewDAO,
|
||||
final ConfigurationDAO configurationDAO,
|
||||
final OrientationDAO orientationDAO,
|
||||
final ConfigurationAttributeDAO configurationAttributeDAO,
|
||||
final ConfigurationValueDAO configurationValueDAO,
|
||||
final SebExamConfigService sebExamConfigService) {
|
||||
super();
|
||||
this.ConfigurationNodeDAO = configurationNodeDAO;
|
||||
this.configurationDAO = configurationDAO;
|
||||
final ConfigurationValueDAO configurationValueDAO) {
|
||||
|
||||
this.viewDAO = viewDAO;
|
||||
this.configurationDAO = configurationDAO;
|
||||
this.orientationDAO = orientationDAO;
|
||||
this.configurationAttributeDAO = configurationAttributeDAO;
|
||||
this.configurationValueDAO = configurationValueDAO;
|
||||
this.sebExamConfigService = sebExamConfigService;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -127,7 +126,7 @@ public class SebExamConfigTemplateServiceImpl implements SebExamConfigTemplateSe
|
|||
}
|
||||
|
||||
@Override
|
||||
public Result<Set<EntityKey>> setDefaultValues(
|
||||
public Result<TemplateAttribute> setDefaultValues(
|
||||
final Long institutionId,
|
||||
final Long templateId,
|
||||
final Long attributeId) {
|
||||
|
@ -137,7 +136,102 @@ public class SebExamConfigTemplateServiceImpl implements SebExamConfigTemplateSe
|
|||
.setDefaultValues(
|
||||
institutionId,
|
||||
config.id,
|
||||
attributeId));
|
||||
attributeId))
|
||||
.flatMap(vals -> getAttribute(
|
||||
institutionId,
|
||||
templateId,
|
||||
attributeId));
|
||||
}
|
||||
|
||||
@Override
|
||||
public Result<TemplateAttribute> removeOrientation(
|
||||
final Long institutionId,
|
||||
final Long templateId,
|
||||
final Long attributeId) {
|
||||
|
||||
return Result.tryCatch(() -> {
|
||||
final Orientation orientation = getOrientation(templateId, attributeId);
|
||||
|
||||
this.orientationDAO.delete(new HashSet<>(Arrays.asList(orientation.getEntityKey())))
|
||||
.getOrThrow();
|
||||
|
||||
final TemplateAttribute attribute = getAttribute(institutionId, templateId, attributeId)
|
||||
.getOrThrow();
|
||||
|
||||
if (attribute.getOrientation() != null) {
|
||||
throw new IllegalStateException(
|
||||
"Failed to remove Orientation, expecting no Orientatoin for attribute: " + attribute);
|
||||
}
|
||||
|
||||
return attribute;
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
public Result<TemplateAttribute> attachDefaultOrientation(
|
||||
final Long institutionId,
|
||||
final Long templateId,
|
||||
final Long attributeId,
|
||||
final Long viewId) {
|
||||
|
||||
return Result.tryCatch(() -> {
|
||||
final Orientation orientation = getOrientation(templateId, attributeId);
|
||||
final Orientation devOrientation = getOrientation(ConfigurationNode.DEFAULT_TEMPLATE_ID, attributeId);
|
||||
|
||||
if (orientation != null) {
|
||||
this.orientationDAO.delete(new HashSet<>(Arrays.asList(orientation.getEntityKey())))
|
||||
.getOrThrow();
|
||||
}
|
||||
|
||||
final Long _viewId;
|
||||
if (viewId == null) {
|
||||
_viewId = this.viewDAO.getDefaultViewForTemplate(templateId, devOrientation.viewId)
|
||||
.getOrThrow().id;
|
||||
} else {
|
||||
_viewId = viewId;
|
||||
}
|
||||
|
||||
final Orientation newOrientation = new Orientation(
|
||||
null,
|
||||
attributeId,
|
||||
templateId,
|
||||
_viewId,
|
||||
devOrientation.groupId,
|
||||
devOrientation.xPosition,
|
||||
devOrientation.yPosition,
|
||||
devOrientation.width,
|
||||
devOrientation.height,
|
||||
devOrientation.title);
|
||||
|
||||
this.orientationDAO.save(newOrientation)
|
||||
.getOrThrow();
|
||||
|
||||
final TemplateAttribute attribute = getAttribute(institutionId, templateId, attributeId)
|
||||
.getOrThrow();
|
||||
|
||||
if (attribute.getOrientation() == null) {
|
||||
throw new IllegalStateException(
|
||||
"Failed to attach default Orientation, expecting Orientatoin for attribute: " + attribute);
|
||||
}
|
||||
|
||||
return attribute;
|
||||
});
|
||||
}
|
||||
|
||||
private Orientation getOrientation(final Long templateId, final Long attributeId) {
|
||||
final FilterMap filterMap = new FilterMap.Builder()
|
||||
.put(Orientation.FILTER_ATTR_TEMPLATE_ID, String.valueOf(templateId))
|
||||
.put(Orientation.FILTER_ATTR_ATTRIBUTE_ID, String.valueOf(attributeId))
|
||||
.create();
|
||||
|
||||
return this.orientationDAO.allMatching(filterMap)
|
||||
.get(error -> {
|
||||
log.warn("Unexpecrted error while get Orientation: ", error);
|
||||
return Collections.emptyList();
|
||||
})
|
||||
.stream()
|
||||
.findFirst()
|
||||
.orElse(null);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -14,6 +14,7 @@ import java.util.UUID;
|
|||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import org.springframework.boot.logging.LogLevel;
|
||||
import org.springframework.context.annotation.Lazy;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
|
@ -31,6 +32,7 @@ import ch.ethz.seb.sebserver.webservice.servicelayer.session.ExamSessionService;
|
|||
import ch.ethz.seb.sebserver.webservice.servicelayer.session.PingHandlingStrategy;
|
||||
import ch.ethz.seb.sebserver.webservice.servicelayer.session.SebClientConnectionService;
|
||||
import ch.ethz.seb.sebserver.webservice.weblayer.api.APIConstraintViolationException;
|
||||
import ch.ethz.seb.sebserver.webservice.weblayer.api.OnlyMessageLogExceptionWrapper;
|
||||
|
||||
@Lazy
|
||||
@Service
|
||||
|
@ -392,7 +394,9 @@ public class SebClientConnectionServiceImpl implements SebClientConnectionServic
|
|||
if (activeClientConnection != null) {
|
||||
|
||||
if (activeClientConnection.clientConnection.status != ConnectionStatus.ESTABLISHED) {
|
||||
throw new IllegalStateException("No established SEB client connection");
|
||||
throw new OnlyMessageLogExceptionWrapper(
|
||||
new IllegalStateException("No established SEB client connection"),
|
||||
LogLevel.WARN);
|
||||
}
|
||||
|
||||
// store event
|
||||
|
@ -404,6 +408,8 @@ public class SebClientConnectionServiceImpl implements SebClientConnectionServic
|
|||
activeClientConnection.getindicatorMapping(event.eventType)
|
||||
.stream()
|
||||
.forEach(indicator -> indicator.notifyValueChange(event));
|
||||
} else {
|
||||
log.warn("No active ClientConnection found for connectionToken: {}", connectionToken);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -53,6 +53,9 @@ public class APIExceptionHandler extends ResponseEntityExceptionHandler {
|
|||
|
||||
if (ex instanceof AccessDeniedException) {
|
||||
log.warn("Access denied: ", ex);
|
||||
} else if (ex instanceof OnlyMessageLogExceptionWrapper) {
|
||||
((OnlyMessageLogExceptionWrapper) ex).log(log);
|
||||
return new ResponseEntity<>(status);
|
||||
} else {
|
||||
log.error("Unexpected generic error catched at the API endpoint: ", ex);
|
||||
}
|
||||
|
@ -83,6 +86,15 @@ public class APIExceptionHandler extends ResponseEntityExceptionHandler {
|
|||
HttpStatus.BAD_REQUEST);
|
||||
}
|
||||
|
||||
@ExceptionHandler(OnlyMessageLogExceptionWrapper.class)
|
||||
public ResponseEntity<Object> onlyMessageLogExceptionWrapper(
|
||||
final OnlyMessageLogExceptionWrapper ex,
|
||||
final WebRequest request) {
|
||||
|
||||
ex.log(log);
|
||||
return new ResponseEntity<>(HttpStatus.BAD_REQUEST);
|
||||
}
|
||||
|
||||
@ExceptionHandler(OAuth2Exception.class)
|
||||
public ResponseEntity<Object> handleOAuth2Exception(
|
||||
final OAuth2Exception ex,
|
||||
|
|
|
@ -13,7 +13,6 @@ import java.io.IOException;
|
|||
import java.io.InputStream;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
|
||||
import javax.servlet.ServletOutputStream;
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
|
@ -39,13 +38,13 @@ import ch.ethz.seb.sebserver.gbl.api.APIMessage;
|
|||
import ch.ethz.seb.sebserver.gbl.api.POSTMapper;
|
||||
import ch.ethz.seb.sebserver.gbl.api.authorization.PrivilegeType;
|
||||
import ch.ethz.seb.sebserver.gbl.model.Domain.EXAM;
|
||||
import ch.ethz.seb.sebserver.gbl.model.EntityKey;
|
||||
import ch.ethz.seb.sebserver.gbl.model.Page;
|
||||
import ch.ethz.seb.sebserver.gbl.model.sebconfig.ConfigKey;
|
||||
import ch.ethz.seb.sebserver.gbl.model.sebconfig.Configuration;
|
||||
import ch.ethz.seb.sebserver.gbl.model.sebconfig.ConfigurationNode;
|
||||
import ch.ethz.seb.sebserver.gbl.model.sebconfig.ConfigurationNode.ConfigurationType;
|
||||
import ch.ethz.seb.sebserver.gbl.model.sebconfig.TemplateAttribute;
|
||||
import ch.ethz.seb.sebserver.gbl.model.user.UserLogActivityType;
|
||||
import ch.ethz.seb.sebserver.gbl.profile.WebServiceProfile;
|
||||
import ch.ethz.seb.sebserver.gbl.util.Result;
|
||||
import ch.ethz.seb.sebserver.gbl.util.Utils;
|
||||
|
@ -305,11 +304,12 @@ public class ConfigurationNodeController extends EntityController<ConfigurationN
|
|||
@RequestMapping(
|
||||
path = API.PARENT_MODEL_ID_VAR_PATH_SEGMENT
|
||||
+ API.TEMPLATE_ATTRIBUTE_ENDPOINT
|
||||
+ API.MODEL_ID_VAR_PATH_SEGMENT,
|
||||
method = RequestMethod.POST,
|
||||
+ API.MODEL_ID_VAR_PATH_SEGMENT
|
||||
+ API.TEMPLATE_ATTRIBUTE_RESET_VALUES,
|
||||
method = RequestMethod.PATCH,
|
||||
consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE,
|
||||
produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
|
||||
public Set<EntityKey> resetTemplateAttribute(
|
||||
public TemplateAttribute resetTemplateAttributeValues(
|
||||
@PathVariable(name = API.PARAM_PARENT_MODEL_ID, required = true) final Long parentModelId,
|
||||
@PathVariable(name = API.PARAM_MODEL_ID, required = true) final Long modelId,
|
||||
@RequestParam(
|
||||
|
@ -323,6 +323,62 @@ public class ConfigurationNodeController extends EntityController<ConfigurationN
|
|||
institutionId,
|
||||
parentModelId,
|
||||
modelId)
|
||||
.flatMap(entity -> this.userActivityLogDAO.log(UserLogActivityType.MODIFY, entity))
|
||||
.getOrThrow();
|
||||
}
|
||||
|
||||
@RequestMapping(
|
||||
path = API.PARENT_MODEL_ID_VAR_PATH_SEGMENT
|
||||
+ API.TEMPLATE_ATTRIBUTE_ENDPOINT
|
||||
+ API.MODEL_ID_VAR_PATH_SEGMENT
|
||||
+ API.TEMPLATE_ATTRIBUTE_ATTACH_DEFAUL_ORIENTATION,
|
||||
method = RequestMethod.PATCH,
|
||||
consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE,
|
||||
produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
|
||||
public TemplateAttribute attachDefaultTemplateAttributeOrientation(
|
||||
@PathVariable(name = API.PARAM_PARENT_MODEL_ID, required = true) final Long parentModelId,
|
||||
@PathVariable(name = API.PARAM_MODEL_ID, required = true) final Long modelId,
|
||||
@RequestParam(
|
||||
name = API.PARAM_INSTITUTION_ID,
|
||||
required = true,
|
||||
defaultValue = UserService.USERS_INSTITUTION_AS_DEFAULT) final Long institutionId,
|
||||
@RequestParam(name = API.PARAM_VIEW_ID) final Long viewId) {
|
||||
|
||||
checkModifyPrivilege(institutionId);
|
||||
|
||||
return this.sebExamConfigTemplateService
|
||||
.attachDefaultOrientation(
|
||||
institutionId,
|
||||
parentModelId,
|
||||
modelId,
|
||||
viewId)
|
||||
.flatMap(entity -> this.userActivityLogDAO.log(UserLogActivityType.MODIFY, entity))
|
||||
.getOrThrow();
|
||||
}
|
||||
|
||||
@RequestMapping(
|
||||
path = API.PARENT_MODEL_ID_VAR_PATH_SEGMENT
|
||||
+ API.TEMPLATE_ATTRIBUTE_ENDPOINT
|
||||
+ API.MODEL_ID_VAR_PATH_SEGMENT
|
||||
+ API.TEMPLATE_ATTRIBUTE_REMOVE_ORIENTATION,
|
||||
method = RequestMethod.PATCH,
|
||||
consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE,
|
||||
produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
|
||||
public TemplateAttribute removeTemplateAttributeOrientation(
|
||||
@PathVariable(name = API.PARAM_PARENT_MODEL_ID, required = true) final Long parentModelId,
|
||||
@PathVariable(name = API.PARAM_MODEL_ID, required = true) final Long modelId,
|
||||
@RequestParam(
|
||||
name = API.PARAM_INSTITUTION_ID,
|
||||
required = true,
|
||||
defaultValue = UserService.USERS_INSTITUTION_AS_DEFAULT) final Long institutionId) {
|
||||
|
||||
checkModifyPrivilege(institutionId);
|
||||
return this.sebExamConfigTemplateService
|
||||
.removeOrientation(
|
||||
institutionId,
|
||||
parentModelId,
|
||||
modelId)
|
||||
.flatMap(entity -> this.userActivityLogDAO.log(UserLogActivityType.MODIFY, entity))
|
||||
.getOrThrow();
|
||||
}
|
||||
|
||||
|
|
|
@ -326,7 +326,8 @@ public class ExamAPI_V1_Controller {
|
|||
@RequestHeader(name = API.EXAM_API_SEB_CONNECTION_TOKEN, required = true) final String connectionToken,
|
||||
@RequestBody(required = true) final ClientEvent event) {
|
||||
|
||||
this.sebClientConnectionService.notifyClientEvent(connectionToken, event);
|
||||
this.sebClientConnectionService
|
||||
.notifyClientEvent(connectionToken, event);
|
||||
}
|
||||
|
||||
private Long getInstitutionId(final Principal principal) {
|
||||
|
|
|
@ -0,0 +1,51 @@
|
|||
/*
|
||||
* Copyright (c) 2019 ETH Zürich, Educational Development and Technology (LET)
|
||||
*
|
||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||
*/
|
||||
|
||||
package ch.ethz.seb.sebserver.webservice.weblayer.api;
|
||||
|
||||
import org.slf4j.Logger;
|
||||
import org.springframework.boot.logging.LogLevel;
|
||||
|
||||
public class OnlyMessageLogExceptionWrapper extends RuntimeException {
|
||||
|
||||
private static final long serialVersionUID = 4177915563660228494L;
|
||||
public final LogLevel logLevel;
|
||||
|
||||
public OnlyMessageLogExceptionWrapper(final Exception cause) {
|
||||
super(cause);
|
||||
this.logLevel = LogLevel.WARN;
|
||||
}
|
||||
|
||||
public OnlyMessageLogExceptionWrapper(final Exception cause, final LogLevel logLevel) {
|
||||
super(cause);
|
||||
this.logLevel = logLevel;
|
||||
}
|
||||
|
||||
public final void log(final Logger logger) {
|
||||
final String message = this.getCause().getMessage();
|
||||
switch (this.logLevel) {
|
||||
case ERROR:
|
||||
case FATAL:
|
||||
logger.error(message);
|
||||
break;
|
||||
case INFO:
|
||||
logger.info(message);
|
||||
break;
|
||||
case TRACE:
|
||||
logger.trace(message);
|
||||
break;
|
||||
case WARN:
|
||||
logger.warn(message);
|
||||
break;
|
||||
default:
|
||||
logger.debug(message);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
|
@ -1,62 +0,0 @@
|
|||
# overall server configuration
|
||||
server.address=0.0.0.0
|
||||
server.port=8080
|
||||
server.servlet.context-path=/
|
||||
server.servlet.session.cookie.http-only=true
|
||||
server.servlet.session.tracking-modes=cookie
|
||||
|
||||
# database server
|
||||
datastore.mariadb.server.address=seb-server-mariadb
|
||||
datastore.mariadb.server.port=3306
|
||||
|
||||
# data source configuration
|
||||
spring.datasource.username=root
|
||||
spring.datasource.initialize=true
|
||||
spring.datasource.initialization-mode=always
|
||||
spring.datasource.url=jdbc:mariadb://${datastore.mariadb.server.address}:${datastore.mariadb.server.port}/SEBServer?useSSL=false&createDatabaseIfNotExist=true
|
||||
spring.datasource.driver-class-name=org.mariadb.jdbc.Driver
|
||||
spring.datasource.platform=demo
|
||||
spring.datasource.hikari.initializationFailTimeout=30000
|
||||
spring.datasource.hikari.connectionTimeout=30000
|
||||
spring.datasource.hikari.idleTimeout=600000
|
||||
spring.datasource.hikari.maxLifetime=1800000
|
||||
|
||||
|
||||
# webservice configuration
|
||||
sebserver.test.property=DEMO SOURCE CONFIG
|
||||
sebserver.webservice.distributed=false
|
||||
sebserver.webservice.http.scheme=http
|
||||
sebserver.webservice.http.server.name=ralph.ethz.ch
|
||||
sebserver.webservice.http.redirect.gui=${sebserver.gui.entrypoint}
|
||||
sebserver.webservice.api.admin.clientId=guiClient
|
||||
sebserver.webservice.api.admin.endpoint=/admin-api/v1
|
||||
sebserver.webservice.api.admin.accessTokenValiditySeconds=3600
|
||||
sebserver.webservice.api.admin.refreshTokenValiditySeconds=-1
|
||||
sebserver.webservice.api.exam.endpoint=/exam-api
|
||||
sebserver.webservice.api.exam.endpoint.discovery=${sebserver.webservice.api.exam.endpoint}/discovery
|
||||
sebserver.webservice.api.exam.endpoint.v1=${sebserver.webservice.api.exam.endpoint}/v1
|
||||
sebserver.webservice.api.exam.accessTokenValiditySeconds=86400
|
||||
sebserver.webservice.api.pagination.maxPageSize=500
|
||||
# comma separated list of known possible OpenEdX API access token request endpoints
|
||||
sebserver.webservice.lms.openedx.api.token.request.paths=/oauth2/access_token
|
||||
# write logs to
|
||||
logging.file=log/sebserver.log
|
||||
|
||||
# actuator configuration
|
||||
management.endpoints.web.base-path=/actuator
|
||||
management.endpoints.web.exposure.include=logfile,loggers
|
||||
|
||||
# GUI server configuration
|
||||
sebserver.gui.entrypoint=/gui
|
||||
sebserver.gui.webservice.protocol=http
|
||||
sebserver.gui.webservice.address=${server.address}
|
||||
sebserver.gui.webservice.port=8080
|
||||
sebserver.gui.webservice.apipath=/admin-api/v1
|
||||
sebserver.gui.theme=css/sebserver.css
|
||||
sebserver.gui.list.page.size=20
|
||||
sebserver.gui.date.displayformat=MM/dd/yyyy HH:mm
|
||||
sebserver.gui.date.displayformat.timezone=|ZZ
|
||||
sebserver.gui.multilingual=false
|
||||
sebserver.gui.languages=en
|
||||
sebserver.gui.seb.client.config.download.filename=SEBClientSettings.seb
|
||||
sebserver.gui.seb.exam.config.download.filename=SEBExamSettings.seb
|
|
@ -22,7 +22,7 @@ spring.quartz.properties.org.quartz.threadPool.threadCount=2
|
|||
sebserver.webservice.distributed=false
|
||||
sebserver.webservice.http.scheme=http
|
||||
sebserver.webservice.http.server.name=${server.address}
|
||||
|
||||
sebserver.webservice.http.port=${server.port}
|
||||
sebserver.webservice.http.redirect.gui=/gui
|
||||
sebserver.webservice.api.admin.endpoint=/admin-api/v1
|
||||
sebserver.webservice.api.admin.accessTokenValiditySeconds=3600
|
||||
|
|
Loading…
Reference in a new issue