minor fixes and tables

This commit is contained in:
anhefti 2019-06-05 13:10:07 +02:00
parent bbb15bba40
commit 652de887a5
93 changed files with 407 additions and 323 deletions

View file

@ -12,6 +12,7 @@ import java.util.Arrays;
import java.util.Collection; import java.util.Collection;
import java.util.Collections; import java.util.Collections;
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonProperty;
public final class ExamAPIDiscovery { public final class ExamAPIDiscovery {
@ -28,11 +29,12 @@ public final class ExamAPIDiscovery {
@JsonProperty("api-versions") @JsonProperty("api-versions")
public final Collection<ExamAPIVersion> versions; public final Collection<ExamAPIVersion> versions;
@JsonCreator
public ExamAPIDiscovery( public ExamAPIDiscovery(
final String title, @JsonProperty("title") final String title,
final String description, @JsonProperty("description") final String description,
final String serverLocation, @JsonProperty("server-location") final String serverLocation,
final Collection<ExamAPIVersion> versions) { @JsonProperty("api-versions") final Collection<ExamAPIVersion> versions) {
this.title = title; this.title = title;
this.description = description; this.description = description;
@ -61,9 +63,10 @@ public final class ExamAPIDiscovery {
@JsonProperty("endpoints") @JsonProperty("endpoints")
public final Collection<Endpoint> endpoints; public final Collection<Endpoint> endpoints;
@JsonCreator
public ExamAPIVersion( public ExamAPIVersion(
final String name, @JsonProperty("name") final String name,
final Collection<Endpoint> endpoints) { @JsonProperty("endpoints") final Collection<Endpoint> endpoints) {
this.name = name; this.name = name;
this.endpoints = endpoints; this.endpoints = endpoints;
@ -92,9 +95,13 @@ public final class ExamAPIDiscovery {
@JsonProperty("authorization") @JsonProperty("authorization")
public final String authorization; public final String authorization;
public Endpoint(final String name, final String descripiton, final String location, @JsonCreator
final String authorization) { public Endpoint(
super(); @JsonProperty("name") final String name,
@JsonProperty("descripiton") final String descripiton,
@JsonProperty("location") final String location,
@JsonProperty("authorization") final String authorization) {
this.name = name; this.name = name;
this.descripiton = descripiton; this.descripiton = descripiton;
this.location = location; this.location = location;

View file

@ -26,8 +26,8 @@ import ch.ethz.seb.sebserver.gbl.api.API;
import ch.ethz.seb.sebserver.gbl.model.Domain; import ch.ethz.seb.sebserver.gbl.model.Domain;
import ch.ethz.seb.sebserver.gbl.model.EntityKey; import ch.ethz.seb.sebserver.gbl.model.EntityKey;
import ch.ethz.seb.sebserver.gbl.model.exam.Exam; import ch.ethz.seb.sebserver.gbl.model.exam.Exam;
import ch.ethz.seb.sebserver.gbl.model.exam.ExamConfigurationMap;
import ch.ethz.seb.sebserver.gbl.model.exam.Exam.ExamStatus; import ch.ethz.seb.sebserver.gbl.model.exam.Exam.ExamStatus;
import ch.ethz.seb.sebserver.gbl.model.exam.ExamConfigurationMap;
import ch.ethz.seb.sebserver.gbl.model.exam.Indicator; import ch.ethz.seb.sebserver.gbl.model.exam.Indicator;
import ch.ethz.seb.sebserver.gbl.model.exam.QuizData; import ch.ethz.seb.sebserver.gbl.model.exam.QuizData;
import ch.ethz.seb.sebserver.gbl.profile.GuiProfile; import ch.ethz.seb.sebserver.gbl.profile.GuiProfile;
@ -283,18 +283,15 @@ public class ExamForm implements TemplateComposer {
.withColumn(new ColumnDefinition<>( .withColumn(new ColumnDefinition<>(
Domain.CONFIGURATION_NODE.ATTR_NAME, Domain.CONFIGURATION_NODE.ATTR_NAME,
CONFIG_NAME_COLUMN_KEY, CONFIG_NAME_COLUMN_KEY,
ExamConfigurationMap::getConfigName, ExamConfigurationMap::getConfigName))
false))
.withColumn(new ColumnDefinition<>( .withColumn(new ColumnDefinition<>(
Domain.CONFIGURATION_NODE.ATTR_DESCRIPTION, Domain.CONFIGURATION_NODE.ATTR_DESCRIPTION,
CONFIG_DESCRIPTION_COLUMN_KEY, CONFIG_DESCRIPTION_COLUMN_KEY,
ExamConfigurationMap::getConfigDescription, ExamConfigurationMap::getConfigDescription))
false))
.withColumn(new ColumnDefinition<>( .withColumn(new ColumnDefinition<>(
Domain.CONFIGURATION_NODE.ATTR_STATUS, Domain.CONFIGURATION_NODE.ATTR_STATUS,
CONFIG_STATUS_COLUMN_KEY, CONFIG_STATUS_COLUMN_KEY,
this.resourceService::localizedExamConfigStatusName, this.resourceService::localizedExamConfigStatusName))
false))
.withDefaultActionIf( .withDefaultActionIf(
() -> editable, () -> editable,
() -> actionBuilder () -> actionBuilder
@ -350,18 +347,15 @@ public class ExamForm implements TemplateComposer {
.withColumn(new ColumnDefinition<>( .withColumn(new ColumnDefinition<>(
Domain.INDICATOR.ATTR_NAME, Domain.INDICATOR.ATTR_NAME,
INDICATOR_NAME_COLUMN_KEY, INDICATOR_NAME_COLUMN_KEY,
Indicator::getName, Indicator::getName))
false))
.withColumn(new ColumnDefinition<>( .withColumn(new ColumnDefinition<>(
Domain.INDICATOR.ATTR_TYPE, Domain.INDICATOR.ATTR_TYPE,
INDICATOR_TYPE_COLUMN_KEY, INDICATOR_TYPE_COLUMN_KEY,
this::indicatorTypeName, this::indicatorTypeName))
false))
.withColumn(new ColumnDefinition<>( .withColumn(new ColumnDefinition<>(
Domain.THRESHOLD.REFERENCE_NAME, Domain.THRESHOLD.REFERENCE_NAME,
INDICATOR_THRESHOLD_COLUMN_KEY, INDICATOR_THRESHOLD_COLUMN_KEY,
ExamForm::thresholdsValue, ExamForm::thresholdsValue))
false))
.withDefaultActionIf( .withDefaultActionIf(
() -> editable, () -> editable,
() -> actionBuilder () -> actionBuilder

View file

@ -110,28 +110,28 @@ public class ExamList implements TemplateComposer {
.withColumn(new ColumnDefinition<>( .withColumn(new ColumnDefinition<>(
Domain.EXAM.ATTR_LMS_SETUP_ID, Domain.EXAM.ATTR_LMS_SETUP_ID,
columnTitleLmsSetupKey, columnTitleLmsSetupKey,
examLmsSetupNameFunction(this.resourceService), examLmsSetupNameFunction(this.resourceService))
this.lmsFilter, .withFilter(this.lmsFilter)
false)) .sortable())
.withColumn(new ColumnDefinition<>( .withColumn(new ColumnDefinition<>(
QuizData.QUIZ_ATTR_NAME, QuizData.QUIZ_ATTR_NAME,
columnTitleNameKey, columnTitleNameKey,
Exam::getName, Exam::getName)
this.nameFilter, .withFilter(this.nameFilter)
true)) .sortable())
.withColumn(new ColumnDefinition<>( .withColumn(new ColumnDefinition<>(
QuizData.QUIZ_ATTR_START_TIME, QuizData.QUIZ_ATTR_START_TIME,
new LocTextKey( new LocTextKey(
"sebserver.exam.list.column.starttime", "sebserver.exam.list.column.starttime",
i18nSupport.getUsersTimeZoneTitleSuffix()), i18nSupport.getUsersTimeZoneTitleSuffix()),
Exam::getStartTime, Exam::getStartTime)
this.startTimeFilter, .withFilter(this.startTimeFilter)
true)) .sortable())
.withColumn(new ColumnDefinition<>( .withColumn(new ColumnDefinition<>(
Domain.EXAM.ATTR_TYPE, Domain.EXAM.ATTR_TYPE,
columnTitleTypeKey, columnTitleTypeKey,
this::examTypeName, this::examTypeName)
true)) .sortable())
.withDefaultAction(actionBuilder .withDefaultAction(actionBuilder
.newAction(ActionDefinition.EXAM_VIEW_FROM_LIST) .newAction(ActionDefinition.EXAM_VIEW_FROM_LIST)
.create()) .create())

View file

@ -79,20 +79,20 @@ public class InstitutionList implements TemplateComposer {
.withColumn(new ColumnDefinition<>( .withColumn(new ColumnDefinition<>(
Domain.INSTITUTION.ATTR_NAME, Domain.INSTITUTION.ATTR_NAME,
NAME_TEXT_KEY, NAME_TEXT_KEY,
entity -> entity.name, Institution::getName)
true)) .sortable())
.withColumn(new ColumnDefinition<>( .withColumn(new ColumnDefinition<>(
Domain.INSTITUTION.ATTR_URL_SUFFIX, Domain.INSTITUTION.ATTR_URL_SUFFIX,
URL_TEXT_KEY, URL_TEXT_KEY,
entity -> entity.urlSuffix, Institution::getUrlSuffix)
true)) .sortable())
.withColumn(new ColumnDefinition<>( .withColumn(new ColumnDefinition<Institution>(
Domain.INSTITUTION.ATTR_ACTIVE, Domain.INSTITUTION.ATTR_ACTIVE,
ACTIVE_TEXT_KEY, ACTIVE_TEXT_KEY,
entity -> this.pageService entity -> this.pageService
.getResourceService() .getResourceService()
.localizedActivityResource().apply(entity.active), .localizedActivityResource().apply(entity.active))
true)) .sortable())
.withDefaultAction(pageActionBuilder .withDefaultAction(pageActionBuilder
.newAction(ActionDefinition.INSTITUTION_VIEW_FROM_LIST) .newAction(ActionDefinition.INSTITUTION_VIEW_FROM_LIST)
.create()) .create())
@ -118,7 +118,6 @@ public class InstitutionList implements TemplateComposer {
.withSelect(table::getSelection, PageAction::applySingleSelection, EMPTY_SELECTION_TEXT_KEY) .withSelect(table::getSelection, PageAction::applySingleSelection, EMPTY_SELECTION_TEXT_KEY)
.publishIf(() -> instGrant.m() && table.hasAnyContent()); .publishIf(() -> instGrant.m() && table.hasAnyContent());
; ;
} }
} }

View file

@ -113,26 +113,27 @@ public class LmsSetupList implements TemplateComposer {
() -> new ColumnDefinition<>( () -> new ColumnDefinition<>(
Domain.LMS_SETUP.ATTR_INSTITUTION_ID, Domain.LMS_SETUP.ATTR_INSTITUTION_ID,
INSTITUTION_TEXT_KEY, INSTITUTION_TEXT_KEY,
lmsSetupInstitutionNameFunction(this.resourceService), lmsSetupInstitutionNameFunction(this.resourceService))
this.institutionFilter, .withFilter(this.institutionFilter))
false))
.withColumn(new ColumnDefinition<>( .withColumn(new ColumnDefinition<>(
Domain.LMS_SETUP.ATTR_NAME, Domain.LMS_SETUP.ATTR_NAME,
NAME_TEXT_KEY, NAME_TEXT_KEY,
entity -> entity.name, LmsSetup::getName)
(isSEBAdmin) ? this.nameFilter : null, .withFilter((isSEBAdmin) ? this.nameFilter : null)
true)) .sortable())
.withColumn(new ColumnDefinition<>( .withColumn(new ColumnDefinition<>(
Domain.LMS_SETUP.ATTR_LMS_TYPE, Domain.LMS_SETUP.ATTR_LMS_TYPE,
TYPE_TEXT_KEY, TYPE_TEXT_KEY,
this::lmsSetupTypeName, this::lmsSetupTypeName)
(isSEBAdmin) ? this.typeFilter : null, .withFilter((isSEBAdmin) ? this.typeFilter : null)
false, true)) .localized()
.sortable())
.withColumn(new ColumnDefinition<>( .withColumn(new ColumnDefinition<>(
Domain.LMS_SETUP.ATTR_ACTIVE, Domain.LMS_SETUP.ATTR_ACTIVE,
ACTIVITY_TEXT_KEY, ACTIVITY_TEXT_KEY,
entity -> entity.active, LmsSetup::getActive)
true)) .sortable())
.withDefaultAction(actionBuilder .withDefaultAction(actionBuilder
.newAction(ActionDefinition.LMS_SETUP_VIEW_FROM_LIST) .newAction(ActionDefinition.LMS_SETUP_VIEW_FROM_LIST)
.create()) .create())

View file

@ -128,30 +128,30 @@ public class QuizDiscoveryList implements TemplateComposer {
.withColumn(new ColumnDefinition<>( .withColumn(new ColumnDefinition<>(
QuizData.QUIZ_ATTR_LMS_SETUP_ID, QuizData.QUIZ_ATTR_LMS_SETUP_ID,
LMS_TEXT_KEY, LMS_TEXT_KEY,
quizDataLmsSetupNameFunction(this.resourceService), quizDataLmsSetupNameFunction(this.resourceService))
this.lmsFilter, .withFilter(this.lmsFilter)
false)) .sortable())
.withColumn(new ColumnDefinition<>( .withColumn(new ColumnDefinition<>(
QuizData.QUIZ_ATTR_NAME, QuizData.QUIZ_ATTR_NAME,
NAME_TEXT_KEY, NAME_TEXT_KEY,
quizData -> quizData.name, QuizData::getName)
this.nameFilter, .withFilter(this.nameFilter)
true)) .sortable())
.withColumn(new ColumnDefinition<>( .withColumn(new ColumnDefinition<>(
QuizData.QUIZ_ATTR_START_TIME, QuizData.QUIZ_ATTR_START_TIME,
new LocTextKey( new LocTextKey(
"sebserver.quizdiscovery.list.column.starttime", "sebserver.quizdiscovery.list.column.starttime",
i18nSupport.getUsersTimeZoneTitleSuffix()), i18nSupport.getUsersTimeZoneTitleSuffix()),
quizData -> quizData.startTime, QuizData::getStartTime)
this.startTimeFilter, .withFilter(this.startTimeFilter)
true)) .sortable())
.withColumn(new ColumnDefinition<>( .withColumn(new ColumnDefinition<>(
QuizData.QUIZ_ATTR_END_TIME, QuizData.QUIZ_ATTR_END_TIME,
new LocTextKey( new LocTextKey(
"sebserver.quizdiscovery.list.column.endtime", "sebserver.quizdiscovery.list.column.endtime",
i18nSupport.getUsersTimeZoneTitleSuffix()), i18nSupport.getUsersTimeZoneTitleSuffix()),
quizData -> quizData.endTime, QuizData::getEndTime)
true)) .sortable())
.withDefaultAction(t -> actionBuilder .withDefaultAction(t -> actionBuilder
.newAction(ActionDefinition.QUIZ_DISCOVERY_SHOW_DETAILS) .newAction(ActionDefinition.QUIZ_DISCOVERY_SHOW_DETAILS)
.withExec(action -> this.showDetails(action, t.getSelectedROWData())) .withExec(action -> this.showDetails(action, t.getSelectedROWData()))

View file

@ -117,28 +117,27 @@ public class SebClientConfigList implements TemplateComposer {
() -> new ColumnDefinition<>( () -> new ColumnDefinition<>(
Domain.LMS_SETUP.ATTR_INSTITUTION_ID, Domain.LMS_SETUP.ATTR_INSTITUTION_ID,
INSTITUTION_TEXT_KEY, INSTITUTION_TEXT_KEY,
clientConfigInstitutionNameFunction(this.resourceService), clientConfigInstitutionNameFunction(this.resourceService))
this.institutionFilter, .withFilter(this.institutionFilter))
false))
.withColumn(new ColumnDefinition<>( .withColumn(new ColumnDefinition<>(
Domain.SEB_CLIENT_CONFIGURATION.ATTR_NAME, Domain.SEB_CLIENT_CONFIGURATION.ATTR_NAME,
NAME_TEXT_KEY, NAME_TEXT_KEY,
entity -> entity.name, SebClientConfig::getName)
this.nameFilter, .withFilter(this.nameFilter)
true)) .sortable())
.withColumn(new ColumnDefinition<>( .withColumn(new ColumnDefinition<>(
Domain.SEB_CLIENT_CONFIGURATION.ATTR_DATE, Domain.SEB_CLIENT_CONFIGURATION.ATTR_DATE,
new LocTextKey( new LocTextKey(
"sebserver.clientconfig.list.column.date", "sebserver.clientconfig.list.column.date",
i18nSupport.getUsersTimeZoneTitleSuffix()), i18nSupport.getUsersTimeZoneTitleSuffix()),
entity -> entity.date, SebClientConfig::getDate)
this.dateFilter, .withFilter(this.dateFilter)
true)) .sortable())
.withColumn(new ColumnDefinition<>( .withColumn(new ColumnDefinition<>(
Domain.SEB_CLIENT_CONFIGURATION.ATTR_ACTIVE, Domain.SEB_CLIENT_CONFIGURATION.ATTR_ACTIVE,
ACTIVE_TEXT_KEY, ACTIVE_TEXT_KEY,
entity -> entity.active, SebClientConfig::getActive)
true)) .sortable())
.withDefaultAction(pageActionBuilder .withDefaultAction(pageActionBuilder
.newAction(ActionDefinition.SEB_CLIENT_CONFIG_VIEW_FROM_LIST) .newAction(ActionDefinition.SEB_CLIENT_CONFIG_VIEW_FROM_LIST)
.create()) .create())

View file

@ -111,27 +111,27 @@ public class SebExamConfigList implements TemplateComposer {
() -> new ColumnDefinition<>( () -> new ColumnDefinition<>(
Domain.LMS_SETUP.ATTR_INSTITUTION_ID, Domain.LMS_SETUP.ATTR_INSTITUTION_ID,
INSTITUTION_TEXT_KEY, INSTITUTION_TEXT_KEY,
this.resourceService::localizedExamConfigInstitutionName, this.resourceService::localizedExamConfigInstitutionName)
this.institutionFilter, .withFilter(this.institutionFilter)
false)) .sortable())
.withColumn(new ColumnDefinition<>( .withColumn(new ColumnDefinition<>(
Domain.CONFIGURATION_NODE.ATTR_NAME, Domain.CONFIGURATION_NODE.ATTR_NAME,
NAME_TEXT_KEY, NAME_TEXT_KEY,
entity -> entity.name, ConfigurationNode::getName)
this.nameFilter, .withFilter(this.nameFilter)
true)) .sortable())
.withColumn(new ColumnDefinition<>( .withColumn(new ColumnDefinition<>(
Domain.CONFIGURATION_NODE.ATTR_DESCRIPTION, Domain.CONFIGURATION_NODE.ATTR_DESCRIPTION,
DESCRIPTION_TEXT_KEY, DESCRIPTION_TEXT_KEY,
entity -> entity.description, ConfigurationNode::getDescription)
this.nameFilter, .withFilter(this.nameFilter)
true)) .sortable())
.withColumn(new ColumnDefinition<>( .withColumn(new ColumnDefinition<ConfigurationNode>(
Domain.CONFIGURATION_NODE.ATTR_STATUS, Domain.CONFIGURATION_NODE.ATTR_STATUS,
STATUS_TEXT_KEY, STATUS_TEXT_KEY,
this.resourceService::localizedExamConfigStatusName, this.resourceService::localizedExamConfigStatusName)
this.statusFilter, .withFilter(this.statusFilter)
true)) .sortable())
.withDefaultAction(pageActionBuilder .withDefaultAction(pageActionBuilder
.newAction(ActionDefinition.SEB_EXAM_CONFIG_VIEW_PROP_FROM_LIST) .newAction(ActionDefinition.SEB_EXAM_CONFIG_VIEW_PROP_FROM_LIST)
.create()) .create())

View file

@ -123,38 +123,44 @@ public class UserAccountList implements TemplateComposer {
() -> new ColumnDefinition<>( () -> new ColumnDefinition<>(
Domain.USER.ATTR_INSTITUTION_ID, Domain.USER.ATTR_INSTITUTION_ID,
INSTITUTION_TEXT_KEY, INSTITUTION_TEXT_KEY,
userInstitutionNameFunction(this.resourceService), userInstitutionNameFunction(this.resourceService))
this.institutionFilter, .withFilter(this.institutionFilter)
false)) .widthProportion(2))
.withColumn(new ColumnDefinition<>( .withColumn(new ColumnDefinition<>(
Domain.USER.ATTR_NAME, Domain.USER.ATTR_NAME,
NAME_TEXT_KEY, NAME_TEXT_KEY,
entity -> entity.name, UserInfo::getName)
this.nameFilter, .withFilter(this.nameFilter)
true)) .sortable()
.widthProportion(2))
.withColumn(new ColumnDefinition<>( .withColumn(new ColumnDefinition<>(
Domain.USER.ATTR_USERNAME, Domain.USER.ATTR_USERNAME,
USER_NAME_TEXT_KEY, USER_NAME_TEXT_KEY,
entity -> entity.username, UserInfo::getUsername)
this.usernameFilter, .withFilter(this.usernameFilter)
true)) .sortable()
.widthProportion(2))
.withColumn(new ColumnDefinition<>( .withColumn(new ColumnDefinition<>(
Domain.USER.ATTR_EMAIL, Domain.USER.ATTR_EMAIL,
MAIL_TEXT_KEY, MAIL_TEXT_KEY,
entity -> entity.email, UserInfo::getEmail)
this.mailFilter, .withFilter(this.mailFilter)
true)) .sortable()
.widthProportion(3))
.withColumn(new ColumnDefinition<>( .withColumn(new ColumnDefinition<>(
Domain.USER.ATTR_LANGUAGE, Domain.USER.ATTR_LANGUAGE,
LANG_TEXT_KEY, LANG_TEXT_KEY,
this::getLocaleDisplayText, this::getLocaleDisplayText)
this.languageFilter, .withFilter(this.languageFilter)
true, true)) .localized()
.sortable()
.widthProportion(2))
.withColumn(new ColumnDefinition<>( .withColumn(new ColumnDefinition<>(
Domain.USER.ATTR_ACTIVE, Domain.USER.ATTR_ACTIVE,
ACTIVE_TEXT_KEY, ACTIVE_TEXT_KEY,
entity -> entity.active, UserInfo::getActive)
true)) .sortable()
.widthProportion(1))
.withDefaultAction(actionBuilder .withDefaultAction(actionBuilder
.newAction(ActionDefinition.USER_ACCOUNT_VIEW_FROM_LIST) .newAction(ActionDefinition.USER_ACCOUNT_VIEW_FROM_LIST)
.create()) .create())

View file

@ -69,7 +69,9 @@ public abstract class AbstractTableFieldBuilder implements InputFieldBuilder {
true, false, true, false,
(tableContext.orientation != null) ? tableContext.orientation.width() : 1, (tableContext.orientation != null) ? tableContext.orientation.width() : 1,
(tableContext.orientation != null) ? tableContext.orientation.height() : 1); (tableContext.orientation != null) ? tableContext.orientation.height() : 1);
gridData.heightHint = tableContext.orientation.height * 20 + 40; if (tableContext.orientation.height != null) {
gridData.heightHint = tableContext.orientation.height * 20 + 40;
}
table.setLayoutData(gridData); table.setLayoutData(gridData);
table.setHeaderVisible(true); table.setHeaderVisible(true);
table.addListener(SWT.Resize, event -> adaptColumnWidth(table, tableContext)); table.addListener(SWT.Resize, event -> adaptColumnWidth(table, tableContext));
@ -267,7 +269,7 @@ public abstract class AbstractTableFieldBuilder implements InputFieldBuilder {
final Map<Long, TableValue> rowValues, final Map<Long, TableValue> rowValues,
final int index) { final int index) {
if (values != null && !values.isEmpty()) { if (!values.isEmpty()) {
values.remove(index); values.remove(index);
values.add(index, rowValues); values.add(index, rowValues);
applyTableRowValues(index); applyTableRowValues(index);

View file

@ -26,7 +26,7 @@ import ch.ethz.seb.sebserver.gui.service.remote.webservice.api.RestCall;
@GuiProfile @GuiProfile
public class ActivateExam extends RestCall<EntityProcessingReport> { public class ActivateExam extends RestCall<EntityProcessingReport> {
protected ActivateExam() { public ActivateExam() {
super(new TypeKey<>( super(new TypeKey<>(
CallType.ACTIVATION_ACTIVATE, CallType.ACTIVATION_ACTIVATE,
EntityType.EXAM, EntityType.EXAM,

View file

@ -26,7 +26,7 @@ import ch.ethz.seb.sebserver.gui.service.remote.webservice.api.RestCall;
@GuiProfile @GuiProfile
public class DeactivateExam extends RestCall<EntityProcessingReport> { public class DeactivateExam extends RestCall<EntityProcessingReport> {
protected DeactivateExam() { public DeactivateExam() {
super(new TypeKey<>( super(new TypeKey<>(
CallType.ACTIVATION_DEACTIVATE, CallType.ACTIVATION_DEACTIVATE,
EntityType.EXAM, EntityType.EXAM,

View file

@ -26,7 +26,7 @@ import ch.ethz.seb.sebserver.gui.service.remote.webservice.api.RestCall;
@GuiProfile @GuiProfile
public class DeleteExamConfigMapping extends RestCall<EntityProcessingReport> { public class DeleteExamConfigMapping extends RestCall<EntityProcessingReport> {
protected DeleteExamConfigMapping() { public DeleteExamConfigMapping() {
super(new TypeKey<>( super(new TypeKey<>(
CallType.DELETE, CallType.DELETE,
EntityType.EXAM_CONFIGURATION_MAP, EntityType.EXAM_CONFIGURATION_MAP,

View file

@ -26,7 +26,7 @@ import ch.ethz.seb.sebserver.gui.service.remote.webservice.api.RestCall;
@GuiProfile @GuiProfile
public class DeleteIndicator extends RestCall<EntityProcessingReport> { public class DeleteIndicator extends RestCall<EntityProcessingReport> {
protected DeleteIndicator() { public DeleteIndicator() {
super(new TypeKey<>( super(new TypeKey<>(
CallType.DELETE, CallType.DELETE,
EntityType.INDICATOR, EntityType.INDICATOR,

View file

@ -26,7 +26,7 @@ import ch.ethz.seb.sebserver.gui.service.remote.webservice.api.RestCall;
@GuiProfile @GuiProfile
public class GetExam extends RestCall<Exam> { public class GetExam extends RestCall<Exam> {
protected GetExam() { public GetExam() {
super(new TypeKey<>( super(new TypeKey<>(
CallType.GET_SINGLE, CallType.GET_SINGLE,
EntityType.EXAM, EntityType.EXAM,

View file

@ -26,7 +26,7 @@ import ch.ethz.seb.sebserver.gui.service.remote.webservice.api.RestCall;
@GuiProfile @GuiProfile
public class GetExamConfigMapping extends RestCall<ExamConfigurationMap> { public class GetExamConfigMapping extends RestCall<ExamConfigurationMap> {
protected GetExamConfigMapping() { public GetExamConfigMapping() {
super(new TypeKey<>( super(new TypeKey<>(
CallType.GET_SINGLE, CallType.GET_SINGLE,
EntityType.EXAM_CONFIGURATION_MAP, EntityType.EXAM_CONFIGURATION_MAP,

View file

@ -28,7 +28,7 @@ import ch.ethz.seb.sebserver.gui.service.remote.webservice.api.RestCall;
@GuiProfile @GuiProfile
public class GetExamConfigMappingNames extends RestCall<List<EntityName>> { public class GetExamConfigMappingNames extends RestCall<List<EntityName>> {
protected GetExamConfigMappingNames() { public GetExamConfigMappingNames() {
super(new TypeKey<>( super(new TypeKey<>(
CallType.GET_NAMES, CallType.GET_NAMES,
EntityType.CONFIGURATION_NODE, EntityType.CONFIGURATION_NODE,

View file

@ -27,7 +27,7 @@ import ch.ethz.seb.sebserver.gui.service.remote.webservice.api.RestCall;
@GuiProfile @GuiProfile
public class GetExamConfigMappingsPage extends RestCall<Page<ExamConfigurationMap>> { public class GetExamConfigMappingsPage extends RestCall<Page<ExamConfigurationMap>> {
protected GetExamConfigMappingsPage() { public GetExamConfigMappingsPage() {
super(new TypeKey<>( super(new TypeKey<>(
CallType.GET_PAGE, CallType.GET_PAGE,
EntityType.EXAM_CONFIGURATION_MAP, EntityType.EXAM_CONFIGURATION_MAP,

View file

@ -28,7 +28,7 @@ import ch.ethz.seb.sebserver.gui.service.remote.webservice.api.RestCall;
@GuiProfile @GuiProfile
public class GetExamDependencies extends RestCall<Set<EntityKey>> { public class GetExamDependencies extends RestCall<Set<EntityKey>> {
protected GetExamDependencies() { public GetExamDependencies() {
super(new TypeKey<>( super(new TypeKey<>(
CallType.GET_DEPENDENCIES, CallType.GET_DEPENDENCIES,
EntityType.EXAM, EntityType.EXAM,

View file

@ -28,7 +28,7 @@ import ch.ethz.seb.sebserver.gui.service.remote.webservice.api.RestCall;
@GuiProfile @GuiProfile
public class GetExamNames extends RestCall<List<EntityName>> { public class GetExamNames extends RestCall<List<EntityName>> {
protected GetExamNames() { public GetExamNames() {
super(new TypeKey<>( super(new TypeKey<>(
CallType.GET_NAMES, CallType.GET_NAMES,
EntityType.EXAM, EntityType.EXAM,

View file

@ -27,7 +27,7 @@ import ch.ethz.seb.sebserver.gui.service.remote.webservice.api.RestCall;
@GuiProfile @GuiProfile
public class GetExamPage extends RestCall<Page<Exam>> { public class GetExamPage extends RestCall<Page<Exam>> {
protected GetExamPage() { public GetExamPage() {
super(new TypeKey<>( super(new TypeKey<>(
CallType.GET_PAGE, CallType.GET_PAGE,
EntityType.EXAM, EntityType.EXAM,

View file

@ -26,7 +26,7 @@ import ch.ethz.seb.sebserver.gui.service.remote.webservice.api.RestCall;
@GuiProfile @GuiProfile
public class GetIndicator extends RestCall<Indicator> { public class GetIndicator extends RestCall<Indicator> {
protected GetIndicator() { public GetIndicator() {
super(new TypeKey<>( super(new TypeKey<>(
CallType.GET_SINGLE, CallType.GET_SINGLE,
EntityType.INDICATOR, EntityType.INDICATOR,

View file

@ -27,7 +27,7 @@ import ch.ethz.seb.sebserver.gui.service.remote.webservice.api.RestCall;
@GuiProfile @GuiProfile
public class GetIndicators extends RestCall<Page<Indicator>> { public class GetIndicators extends RestCall<Page<Indicator>> {
protected GetIndicators() { public GetIndicators() {
super(new TypeKey<>( super(new TypeKey<>(
CallType.GET_PAGE, CallType.GET_PAGE,
EntityType.INDICATOR, EntityType.INDICATOR,

View file

@ -26,7 +26,7 @@ import ch.ethz.seb.sebserver.gui.service.remote.webservice.api.RestCall;
@GuiProfile @GuiProfile
public class NewExamConfigMapping extends RestCall<ExamConfigurationMap> { public class NewExamConfigMapping extends RestCall<ExamConfigurationMap> {
protected NewExamConfigMapping() { public NewExamConfigMapping() {
super(new TypeKey<>( super(new TypeKey<>(
CallType.NEW, CallType.NEW,
EntityType.EXAM_CONFIGURATION_MAP, EntityType.EXAM_CONFIGURATION_MAP,

View file

@ -26,7 +26,7 @@ import ch.ethz.seb.sebserver.gui.service.remote.webservice.api.RestCall;
@GuiProfile @GuiProfile
public class NewIndicator extends RestCall<Indicator> { public class NewIndicator extends RestCall<Indicator> {
protected NewIndicator() { public NewIndicator() {
super(new TypeKey<>( super(new TypeKey<>(
CallType.NEW, CallType.NEW,
EntityType.INDICATOR, EntityType.INDICATOR,

View file

@ -26,7 +26,7 @@ import ch.ethz.seb.sebserver.gui.service.remote.webservice.api.RestCall;
@GuiProfile @GuiProfile
public class SaveExam extends RestCall<Exam> { public class SaveExam extends RestCall<Exam> {
protected SaveExam() { public SaveExam() {
super(new TypeKey<>( super(new TypeKey<>(
CallType.SAVE, CallType.SAVE,
EntityType.EXAM, EntityType.EXAM,

View file

@ -26,7 +26,7 @@ import ch.ethz.seb.sebserver.gui.service.remote.webservice.api.RestCall;
@GuiProfile @GuiProfile
public class SaveExamConfigMapping extends RestCall<ExamConfigurationMap> { public class SaveExamConfigMapping extends RestCall<ExamConfigurationMap> {
protected SaveExamConfigMapping() { public SaveExamConfigMapping() {
super(new TypeKey<>( super(new TypeKey<>(
CallType.SAVE, CallType.SAVE,
EntityType.EXAM_CONFIGURATION_MAP, EntityType.EXAM_CONFIGURATION_MAP,

View file

@ -26,7 +26,7 @@ import ch.ethz.seb.sebserver.gui.service.remote.webservice.api.RestCall;
@GuiProfile @GuiProfile
public class SaveIndicator extends RestCall<Indicator> { public class SaveIndicator extends RestCall<Indicator> {
protected SaveIndicator() { public SaveIndicator() {
super(new TypeKey<>( super(new TypeKey<>(
CallType.SAVE, CallType.SAVE,
EntityType.INDICATOR, EntityType.INDICATOR,

View file

@ -26,7 +26,7 @@ import ch.ethz.seb.sebserver.gui.service.remote.webservice.api.RestCall;
@GuiProfile @GuiProfile
public class ActivateInstitution extends RestCall<EntityProcessingReport> { public class ActivateInstitution extends RestCall<EntityProcessingReport> {
protected ActivateInstitution() { public ActivateInstitution() {
super(new TypeKey<>( super(new TypeKey<>(
CallType.ACTIVATION_ACTIVATE, CallType.ACTIVATION_ACTIVATE,
EntityType.INSTITUTION, EntityType.INSTITUTION,

View file

@ -26,7 +26,7 @@ import ch.ethz.seb.sebserver.gui.service.remote.webservice.api.RestCall;
@GuiProfile @GuiProfile
public class DeactivateInstitution extends RestCall<EntityProcessingReport> { public class DeactivateInstitution extends RestCall<EntityProcessingReport> {
protected DeactivateInstitution() { public DeactivateInstitution() {
super(new TypeKey<>( super(new TypeKey<>(
CallType.ACTIVATION_DEACTIVATE, CallType.ACTIVATION_DEACTIVATE,
EntityType.INSTITUTION, EntityType.INSTITUTION,

View file

@ -26,7 +26,7 @@ import ch.ethz.seb.sebserver.gui.service.remote.webservice.api.RestCall;
@GuiProfile @GuiProfile
public class GetInstitution extends RestCall<Institution> { public class GetInstitution extends RestCall<Institution> {
protected GetInstitution() { public GetInstitution() {
super(new TypeKey<>( super(new TypeKey<>(
CallType.GET_SINGLE, CallType.GET_SINGLE,
EntityType.INSTITUTION, EntityType.INSTITUTION,

View file

@ -28,7 +28,7 @@ import ch.ethz.seb.sebserver.gui.service.remote.webservice.api.RestCall;
@GuiProfile @GuiProfile
public class GetInstitutionDependency extends RestCall<Set<EntityKey>> { public class GetInstitutionDependency extends RestCall<Set<EntityKey>> {
protected GetInstitutionDependency() { public GetInstitutionDependency() {
super(new TypeKey<>( super(new TypeKey<>(
CallType.GET_DEPENDENCIES, CallType.GET_DEPENDENCIES,
EntityType.INSTITUTION, EntityType.INSTITUTION,

View file

@ -28,7 +28,7 @@ import ch.ethz.seb.sebserver.gui.service.remote.webservice.api.RestCall;
@GuiProfile @GuiProfile
public class GetInstitutionNames extends RestCall<List<EntityName>> { public class GetInstitutionNames extends RestCall<List<EntityName>> {
protected GetInstitutionNames() { public GetInstitutionNames() {
super(new TypeKey<>( super(new TypeKey<>(
CallType.GET_NAMES, CallType.GET_NAMES,
EntityType.INSTITUTION, EntityType.INSTITUTION,

View file

@ -27,7 +27,7 @@ import ch.ethz.seb.sebserver.gui.service.remote.webservice.api.RestCall;
@GuiProfile @GuiProfile
public class GetInstitutionPage extends RestCall<Page<Institution>> { public class GetInstitutionPage extends RestCall<Page<Institution>> {
protected GetInstitutionPage() { public GetInstitutionPage() {
super(new TypeKey<>( super(new TypeKey<>(
CallType.GET_PAGE, CallType.GET_PAGE,
EntityType.INSTITUTION, EntityType.INSTITUTION,

View file

@ -26,7 +26,7 @@ import ch.ethz.seb.sebserver.gui.service.remote.webservice.api.RestCall;
@GuiProfile @GuiProfile
public class NewInstitution extends RestCall<Institution> { public class NewInstitution extends RestCall<Institution> {
protected NewInstitution() { public NewInstitution() {
super(new TypeKey<>( super(new TypeKey<>(
CallType.NEW, CallType.NEW,
EntityType.INSTITUTION, EntityType.INSTITUTION,

View file

@ -26,7 +26,7 @@ import ch.ethz.seb.sebserver.gui.service.remote.webservice.api.RestCall;
@GuiProfile @GuiProfile
public class SaveInstitution extends RestCall<Institution> { public class SaveInstitution extends RestCall<Institution> {
protected SaveInstitution() { public SaveInstitution() {
super(new TypeKey<>( super(new TypeKey<>(
CallType.SAVE, CallType.SAVE,
EntityType.INSTITUTION, EntityType.INSTITUTION,

View file

@ -26,7 +26,7 @@ import ch.ethz.seb.sebserver.gui.service.remote.webservice.api.RestCall;
@GuiProfile @GuiProfile
public class ActivateLmsSetup extends RestCall<EntityProcessingReport> { public class ActivateLmsSetup extends RestCall<EntityProcessingReport> {
protected ActivateLmsSetup() { public ActivateLmsSetup() {
super(new TypeKey<>( super(new TypeKey<>(
CallType.ACTIVATION_ACTIVATE, CallType.ACTIVATION_ACTIVATE,
EntityType.LMS_SETUP, EntityType.LMS_SETUP,

View file

@ -26,7 +26,7 @@ import ch.ethz.seb.sebserver.gui.service.remote.webservice.api.RestCall;
@GuiProfile @GuiProfile
public class DeactivateLmsSetup extends RestCall<EntityProcessingReport> { public class DeactivateLmsSetup extends RestCall<EntityProcessingReport> {
protected DeactivateLmsSetup() { public DeactivateLmsSetup() {
super(new TypeKey<>( super(new TypeKey<>(
CallType.ACTIVATION_DEACTIVATE, CallType.ACTIVATION_DEACTIVATE,
EntityType.LMS_SETUP, EntityType.LMS_SETUP,

View file

@ -26,7 +26,7 @@ import ch.ethz.seb.sebserver.gui.service.remote.webservice.api.RestCall;
@GuiProfile @GuiProfile
public class GetLmsSetup extends RestCall<LmsSetup> { public class GetLmsSetup extends RestCall<LmsSetup> {
protected GetLmsSetup() { public GetLmsSetup() {
super(new TypeKey<>( super(new TypeKey<>(
CallType.GET_SINGLE, CallType.GET_SINGLE,
EntityType.LMS_SETUP, EntityType.LMS_SETUP,

View file

@ -28,7 +28,7 @@ import ch.ethz.seb.sebserver.gui.service.remote.webservice.api.RestCall;
@GuiProfile @GuiProfile
public class GetLmsSetupDependencies extends RestCall<Set<EntityKey>> { public class GetLmsSetupDependencies extends RestCall<Set<EntityKey>> {
protected GetLmsSetupDependencies() { public GetLmsSetupDependencies() {
super(new TypeKey<>( super(new TypeKey<>(
CallType.GET_DEPENDENCIES, CallType.GET_DEPENDENCIES,
EntityType.LMS_SETUP, EntityType.LMS_SETUP,

View file

@ -28,7 +28,7 @@ import ch.ethz.seb.sebserver.gui.service.remote.webservice.api.RestCall;
@GuiProfile @GuiProfile
public class GetLmsSetupNames extends RestCall<List<EntityName>> { public class GetLmsSetupNames extends RestCall<List<EntityName>> {
protected GetLmsSetupNames() { public GetLmsSetupNames() {
super(new TypeKey<>( super(new TypeKey<>(
CallType.GET_NAMES, CallType.GET_NAMES,
EntityType.LMS_SETUP, EntityType.LMS_SETUP,

View file

@ -27,7 +27,7 @@ import ch.ethz.seb.sebserver.gui.service.remote.webservice.api.RestCall;
@GuiProfile @GuiProfile
public class GetLmsSetupPage extends RestCall<Page<LmsSetup>> { public class GetLmsSetupPage extends RestCall<Page<LmsSetup>> {
protected GetLmsSetupPage() { public GetLmsSetupPage() {
super(new TypeKey<>( super(new TypeKey<>(
CallType.GET_PAGE, CallType.GET_PAGE,
EntityType.LMS_SETUP, EntityType.LMS_SETUP,

View file

@ -26,7 +26,7 @@ import ch.ethz.seb.sebserver.gui.service.remote.webservice.api.RestCall;
@GuiProfile @GuiProfile
public class NewLmsSetup extends RestCall<LmsSetup> { public class NewLmsSetup extends RestCall<LmsSetup> {
protected NewLmsSetup() { public NewLmsSetup() {
super(new TypeKey<>( super(new TypeKey<>(
CallType.NEW, CallType.NEW,
EntityType.LMS_SETUP, EntityType.LMS_SETUP,

View file

@ -26,7 +26,7 @@ import ch.ethz.seb.sebserver.gui.service.remote.webservice.api.RestCall;
@GuiProfile @GuiProfile
public class SaveLmsSetup extends RestCall<LmsSetup> { public class SaveLmsSetup extends RestCall<LmsSetup> {
protected SaveLmsSetup() { public SaveLmsSetup() {
super(new TypeKey<>( super(new TypeKey<>(
CallType.SAVE, CallType.SAVE,
EntityType.LMS_SETUP, EntityType.LMS_SETUP,

View file

@ -26,7 +26,7 @@ import ch.ethz.seb.sebserver.gui.service.remote.webservice.api.RestCall;
@GuiProfile @GuiProfile
public class TestLmsSetup extends RestCall<LmsSetupTestResult> { public class TestLmsSetup extends RestCall<LmsSetupTestResult> {
protected TestLmsSetup() { public TestLmsSetup() {
super(new TypeKey<>( super(new TypeKey<>(
CallType.UNDEFINED, CallType.UNDEFINED,
EntityType.LMS_SETUP, EntityType.LMS_SETUP,

View file

@ -26,7 +26,7 @@ import ch.ethz.seb.sebserver.gui.service.remote.webservice.api.RestCall;
@GuiProfile @GuiProfile
public class TestLmsSetupAdHoc extends RestCall<LmsSetupTestResult> { public class TestLmsSetupAdHoc extends RestCall<LmsSetupTestResult> {
protected TestLmsSetupAdHoc() { public TestLmsSetupAdHoc() {
super(new TypeKey<>( super(new TypeKey<>(
CallType.UNDEFINED, CallType.UNDEFINED,
EntityType.LMS_SETUP, EntityType.LMS_SETUP,

View file

@ -26,7 +26,7 @@ import ch.ethz.seb.sebserver.gui.service.remote.webservice.api.RestCall;
@GuiProfile @GuiProfile
public class GetQuizData extends RestCall<QuizData> { public class GetQuizData extends RestCall<QuizData> {
protected GetQuizData() { public GetQuizData() {
super(new TypeKey<>( super(new TypeKey<>(
CallType.GET_SINGLE, CallType.GET_SINGLE,
EntityType.EXAM, EntityType.EXAM,

View file

@ -27,7 +27,7 @@ import ch.ethz.seb.sebserver.gui.service.remote.webservice.api.RestCall;
@GuiProfile @GuiProfile
public class GetQuizPage extends RestCall<Page<QuizData>> { public class GetQuizPage extends RestCall<Page<QuizData>> {
protected GetQuizPage() { public GetQuizPage() {
super(new TypeKey<>( super(new TypeKey<>(
CallType.GET_PAGE, CallType.GET_PAGE,
EntityType.EXAM, EntityType.EXAM,

View file

@ -26,7 +26,7 @@ import ch.ethz.seb.sebserver.gui.service.remote.webservice.api.RestCall;
@GuiProfile @GuiProfile
public class ImportAsExam extends RestCall<Exam> { public class ImportAsExam extends RestCall<Exam> {
protected ImportAsExam() { public ImportAsExam() {
super(new TypeKey<>( super(new TypeKey<>(
CallType.NEW, CallType.NEW,
EntityType.EXAM, EntityType.EXAM,

View file

@ -26,7 +26,7 @@ import ch.ethz.seb.sebserver.gui.service.remote.webservice.api.RestCall;
@GuiProfile @GuiProfile
public class ActivateClientConfig extends RestCall<EntityProcessingReport> { public class ActivateClientConfig extends RestCall<EntityProcessingReport> {
protected ActivateClientConfig() { public ActivateClientConfig() {
super(new TypeKey<>( super(new TypeKey<>(
CallType.ACTIVATION_ACTIVATE, CallType.ACTIVATION_ACTIVATE,
EntityType.SEB_CLIENT_CONFIGURATION, EntityType.SEB_CLIENT_CONFIGURATION,

View file

@ -26,7 +26,7 @@ import ch.ethz.seb.sebserver.gui.service.remote.webservice.api.RestCall;
@GuiProfile @GuiProfile
public class DeactivateClientConfig extends RestCall<EntityProcessingReport> { public class DeactivateClientConfig extends RestCall<EntityProcessingReport> {
protected DeactivateClientConfig() { public DeactivateClientConfig() {
super(new TypeKey<>( super(new TypeKey<>(
CallType.ACTIVATION_DEACTIVATE, CallType.ACTIVATION_DEACTIVATE,
EntityType.SEB_CLIENT_CONFIGURATION, EntityType.SEB_CLIENT_CONFIGURATION,

View file

@ -25,7 +25,7 @@ import ch.ethz.seb.sebserver.gui.service.remote.webservice.api.AbstractExportCal
@GuiProfile @GuiProfile
public class ExportClientConfig extends AbstractExportCall { public class ExportClientConfig extends AbstractExportCall {
protected ExportClientConfig() { public ExportClientConfig() {
super(new TypeKey<>( super(new TypeKey<>(
CallType.UNDEFINED, CallType.UNDEFINED,
EntityType.SEB_CLIENT_CONFIGURATION, EntityType.SEB_CLIENT_CONFIGURATION,

View file

@ -26,7 +26,7 @@ import ch.ethz.seb.sebserver.gui.service.remote.webservice.api.RestCall;
@GuiProfile @GuiProfile
public class GetClientConfig extends RestCall<SebClientConfig> { public class GetClientConfig extends RestCall<SebClientConfig> {
protected GetClientConfig() { public GetClientConfig() {
super(new TypeKey<>( super(new TypeKey<>(
CallType.GET_SINGLE, CallType.GET_SINGLE,
EntityType.SEB_CLIENT_CONFIGURATION, EntityType.SEB_CLIENT_CONFIGURATION,

View file

@ -27,7 +27,7 @@ import ch.ethz.seb.sebserver.gui.service.remote.webservice.api.RestCall;
@GuiProfile @GuiProfile
public class GetClientConfigPage extends RestCall<Page<SebClientConfig>> { public class GetClientConfigPage extends RestCall<Page<SebClientConfig>> {
protected GetClientConfigPage() { public GetClientConfigPage() {
super(new TypeKey<>( super(new TypeKey<>(
CallType.GET_PAGE, CallType.GET_PAGE,
EntityType.SEB_CLIENT_CONFIGURATION, EntityType.SEB_CLIENT_CONFIGURATION,

View file

@ -26,7 +26,7 @@ import ch.ethz.seb.sebserver.gui.service.remote.webservice.api.RestCall;
@GuiProfile @GuiProfile
public class NewClientConfig extends RestCall<SebClientConfig> { public class NewClientConfig extends RestCall<SebClientConfig> {
protected NewClientConfig() { public NewClientConfig() {
super(new TypeKey<>( super(new TypeKey<>(
CallType.NEW, CallType.NEW,
EntityType.SEB_CLIENT_CONFIGURATION, EntityType.SEB_CLIENT_CONFIGURATION,

View file

@ -26,7 +26,7 @@ import ch.ethz.seb.sebserver.gui.service.remote.webservice.api.RestCall;
@GuiProfile @GuiProfile
public class SaveClientConfig extends RestCall<SebClientConfig> { public class SaveClientConfig extends RestCall<SebClientConfig> {
protected SaveClientConfig() { public SaveClientConfig() {
super(new TypeKey<>( super(new TypeKey<>(
CallType.SAVE, CallType.SAVE,
EntityType.SEB_CLIENT_CONFIGURATION, EntityType.SEB_CLIENT_CONFIGURATION,

View file

@ -26,7 +26,7 @@ import ch.ethz.seb.sebserver.gui.service.remote.webservice.api.RestCall;
@GuiProfile @GuiProfile
public class ActivateExamConfig extends RestCall<EntityProcessingReport> { public class ActivateExamConfig extends RestCall<EntityProcessingReport> {
protected ActivateExamConfig() { public ActivateExamConfig() {
super(new TypeKey<>( super(new TypeKey<>(
CallType.ACTIVATION_ACTIVATE, CallType.ACTIVATION_ACTIVATE,
EntityType.CONFIGURATION_NODE, EntityType.CONFIGURATION_NODE,

View file

@ -26,7 +26,7 @@ import ch.ethz.seb.sebserver.gui.service.remote.webservice.api.RestCall;
@GuiProfile @GuiProfile
public class DeactivateExamConfig extends RestCall<EntityProcessingReport> { public class DeactivateExamConfig extends RestCall<EntityProcessingReport> {
protected DeactivateExamConfig() { public DeactivateExamConfig() {
super(new TypeKey<>( super(new TypeKey<>(
CallType.ACTIVATION_DEACTIVATE, CallType.ACTIVATION_DEACTIVATE,
EntityType.CONFIGURATION_NODE, EntityType.CONFIGURATION_NODE,

View file

@ -25,7 +25,7 @@ import ch.ethz.seb.sebserver.gui.service.remote.webservice.api.AbstractExportCal
@GuiProfile @GuiProfile
public class ExportPlainXML extends AbstractExportCall { public class ExportPlainXML extends AbstractExportCall {
protected ExportPlainXML() { public ExportPlainXML() {
super(new TypeKey<>( super(new TypeKey<>(
CallType.UNDEFINED, CallType.UNDEFINED,
EntityType.CONFIGURATION_NODE, EntityType.CONFIGURATION_NODE,

View file

@ -26,7 +26,7 @@ import ch.ethz.seb.sebserver.gui.service.remote.webservice.api.RestCall;
@GuiProfile @GuiProfile
public class GetConfiguration extends RestCall<Configuration> { public class GetConfiguration extends RestCall<Configuration> {
protected GetConfiguration() { public GetConfiguration() {
super(new TypeKey<>( super(new TypeKey<>(
CallType.GET_SINGLE, CallType.GET_SINGLE,
EntityType.CONFIGURATION, EntityType.CONFIGURATION,

View file

@ -27,7 +27,7 @@ import ch.ethz.seb.sebserver.gui.service.remote.webservice.api.RestCall;
@GuiProfile @GuiProfile
public class GetConfigurationPage extends RestCall<Page<Configuration>> { public class GetConfigurationPage extends RestCall<Page<Configuration>> {
protected GetConfigurationPage() { public GetConfigurationPage() {
super(new TypeKey<>( super(new TypeKey<>(
CallType.GET_PAGE, CallType.GET_PAGE,
EntityType.CONFIGURATION, EntityType.CONFIGURATION,

View file

@ -27,7 +27,7 @@ import ch.ethz.seb.sebserver.gui.service.remote.webservice.api.RestCall;
@GuiProfile @GuiProfile
public class GetConfigurationValuePage extends RestCall<Page<ConfigurationValue>> { public class GetConfigurationValuePage extends RestCall<Page<ConfigurationValue>> {
protected GetConfigurationValuePage() { public GetConfigurationValuePage() {
super(new TypeKey<>( super(new TypeKey<>(
CallType.GET_PAGE, CallType.GET_PAGE,
EntityType.CONFIGURATION_VALUE, EntityType.CONFIGURATION_VALUE,

View file

@ -26,7 +26,7 @@ import ch.ethz.seb.sebserver.gui.service.remote.webservice.api.PageToListCallAda
@GuiProfile @GuiProfile
public class GetConfigurationValues extends PageToListCallAdapter<ConfigurationValue> { public class GetConfigurationValues extends PageToListCallAdapter<ConfigurationValue> {
protected GetConfigurationValues() { public GetConfigurationValues() {
super( super(
GetConfigurationValuePage.class, GetConfigurationValuePage.class,
EntityType.CONFIGURATION_VALUE, EntityType.CONFIGURATION_VALUE,

View file

@ -26,7 +26,7 @@ import ch.ethz.seb.sebserver.gui.service.remote.webservice.api.PageToListCallAda
@GuiProfile @GuiProfile
public class GetConfigurations extends PageToListCallAdapter<Configuration> { public class GetConfigurations extends PageToListCallAdapter<Configuration> {
protected GetConfigurations() { public GetConfigurations() {
super( super(
GetConfigurationPage.class, GetConfigurationPage.class,
EntityType.CONFIGURATION, EntityType.CONFIGURATION,

View file

@ -26,7 +26,7 @@ import ch.ethz.seb.sebserver.gui.service.remote.webservice.api.RestCall;
@GuiProfile @GuiProfile
public class GetExamConfigNode extends RestCall<ConfigurationNode> { public class GetExamConfigNode extends RestCall<ConfigurationNode> {
protected GetExamConfigNode() { public GetExamConfigNode() {
super(new TypeKey<>( super(new TypeKey<>(
CallType.GET_SINGLE, CallType.GET_SINGLE,
EntityType.CONFIGURATION_NODE, EntityType.CONFIGURATION_NODE,

View file

@ -27,7 +27,7 @@ import ch.ethz.seb.sebserver.gui.service.remote.webservice.api.RestCall;
@GuiProfile @GuiProfile
public class GetExamConfigNodePage extends RestCall<Page<ConfigurationNode>> { public class GetExamConfigNodePage extends RestCall<Page<ConfigurationNode>> {
protected GetExamConfigNodePage() { public GetExamConfigNodePage() {
super(new TypeKey<>( super(new TypeKey<>(
CallType.GET_PAGE, CallType.GET_PAGE,
EntityType.CONFIGURATION_NODE, EntityType.CONFIGURATION_NODE,

View file

@ -27,7 +27,7 @@ import ch.ethz.seb.sebserver.gui.service.remote.webservice.api.RestCall;
@GuiProfile @GuiProfile
public class GetOrientationPage extends RestCall<Page<Orientation>> { public class GetOrientationPage extends RestCall<Page<Orientation>> {
protected GetOrientationPage() { public GetOrientationPage() {
super(new TypeKey<>( super(new TypeKey<>(
CallType.GET_PAGE, CallType.GET_PAGE,
EntityType.ORIENTATION, EntityType.ORIENTATION,

View file

@ -26,7 +26,7 @@ import ch.ethz.seb.sebserver.gui.service.remote.webservice.api.PageToListCallAda
@GuiProfile @GuiProfile
public class GetOrientations extends PageToListCallAdapter<Orientation> { public class GetOrientations extends PageToListCallAdapter<Orientation> {
protected GetOrientations() { public GetOrientations() {
super( super(
GetOrientationPage.class, GetOrientationPage.class,
EntityType.ORIENTATION, EntityType.ORIENTATION,

View file

@ -28,7 +28,7 @@ import ch.ethz.seb.sebserver.gui.service.remote.webservice.api.RestCall;
@GuiProfile @GuiProfile
public class GetViewList extends RestCall<List<View>> { public class GetViewList extends RestCall<List<View>> {
protected GetViewList() { public GetViewList() {
super(new TypeKey<>( super(new TypeKey<>(
CallType.GET_LIST, CallType.GET_LIST,
EntityType.VIEW, EntityType.VIEW,

View file

@ -26,7 +26,7 @@ import ch.ethz.seb.sebserver.gui.service.remote.webservice.api.RestCall;
@GuiProfile @GuiProfile
public class NewExamConfig extends RestCall<ConfigurationNode> { public class NewExamConfig extends RestCall<ConfigurationNode> {
protected NewExamConfig() { public NewExamConfig() {
super(new TypeKey<>( super(new TypeKey<>(
CallType.NEW, CallType.NEW,
EntityType.CONFIGURATION_NODE, EntityType.CONFIGURATION_NODE,

View file

@ -26,7 +26,7 @@ import ch.ethz.seb.sebserver.gui.service.remote.webservice.api.RestCall;
@GuiProfile @GuiProfile
public class SaveExamConfig extends RestCall<ConfigurationNode> { public class SaveExamConfig extends RestCall<ConfigurationNode> {
protected SaveExamConfig() { public SaveExamConfig() {
super(new TypeKey<>( super(new TypeKey<>(
CallType.SAVE, CallType.SAVE,
EntityType.CONFIGURATION_NODE, EntityType.CONFIGURATION_NODE,

View file

@ -26,7 +26,7 @@ import ch.ethz.seb.sebserver.gui.service.remote.webservice.api.RestCall;
@GuiProfile @GuiProfile
public class SaveExamConfigHistory extends RestCall<Configuration> { public class SaveExamConfigHistory extends RestCall<Configuration> {
protected SaveExamConfigHistory() { public SaveExamConfigHistory() {
super(new TypeKey<>( super(new TypeKey<>(
CallType.SAVE, CallType.SAVE,
EntityType.CONFIGURATION, EntityType.CONFIGURATION,

View file

@ -26,7 +26,7 @@ import ch.ethz.seb.sebserver.gui.service.remote.webservice.api.RestCall;
@GuiProfile @GuiProfile
public class SaveExamConfigTableValues extends RestCall<ConfigurationTableValues> { public class SaveExamConfigTableValues extends RestCall<ConfigurationTableValues> {
protected SaveExamConfigTableValues() { public SaveExamConfigTableValues() {
super(new TypeKey<>( super(new TypeKey<>(
CallType.SAVE, CallType.SAVE,
EntityType.CONFIGURATION_VALUE, EntityType.CONFIGURATION_VALUE,

View file

@ -26,7 +26,7 @@ import ch.ethz.seb.sebserver.gui.service.remote.webservice.api.RestCall;
@GuiProfile @GuiProfile
public class SaveExamConfigValue extends RestCall<ConfigurationValue> { public class SaveExamConfigValue extends RestCall<ConfigurationValue> {
protected SaveExamConfigValue() { public SaveExamConfigValue() {
super(new TypeKey<>( super(new TypeKey<>(
CallType.SAVE, CallType.SAVE,
EntityType.CONFIGURATION_VALUE, EntityType.CONFIGURATION_VALUE,

View file

@ -26,7 +26,7 @@ import ch.ethz.seb.sebserver.gui.service.remote.webservice.api.RestCall;
@GuiProfile @GuiProfile
public class SebExamConfigUndo extends RestCall<Configuration> { public class SebExamConfigUndo extends RestCall<Configuration> {
protected SebExamConfigUndo() { public SebExamConfigUndo() {
super(new TypeKey<>( super(new TypeKey<>(
CallType.SAVE, CallType.SAVE,
EntityType.CONFIGURATION, EntityType.CONFIGURATION,

View file

@ -26,7 +26,7 @@ import ch.ethz.seb.sebserver.gui.service.remote.webservice.api.RestCall;
@GuiProfile @GuiProfile
public class ActivateUserAccount extends RestCall<EntityProcessingReport> { public class ActivateUserAccount extends RestCall<EntityProcessingReport> {
protected ActivateUserAccount() { public ActivateUserAccount() {
super(new TypeKey<>( super(new TypeKey<>(
CallType.ACTIVATION_ACTIVATE, CallType.ACTIVATION_ACTIVATE,
EntityType.USER, EntityType.USER,

View file

@ -26,7 +26,7 @@ import ch.ethz.seb.sebserver.gui.service.remote.webservice.api.RestCall;
@GuiProfile @GuiProfile
public class ChangePassword extends RestCall<UserInfo> { public class ChangePassword extends RestCall<UserInfo> {
protected ChangePassword() { public ChangePassword() {
super(new TypeKey<>( super(new TypeKey<>(
CallType.UNDEFINED, CallType.UNDEFINED,
EntityType.USER, EntityType.USER,

View file

@ -26,7 +26,7 @@ import ch.ethz.seb.sebserver.gui.service.remote.webservice.api.RestCall;
@GuiProfile @GuiProfile
public class DeactivateUserAccount extends RestCall<EntityProcessingReport> { public class DeactivateUserAccount extends RestCall<EntityProcessingReport> {
protected DeactivateUserAccount() { public DeactivateUserAccount() {
super(new TypeKey<>( super(new TypeKey<>(
CallType.ACTIVATION_DEACTIVATE, CallType.ACTIVATION_DEACTIVATE,
EntityType.USER, EntityType.USER,

View file

@ -26,7 +26,7 @@ import ch.ethz.seb.sebserver.gui.service.remote.webservice.api.RestCall;
@GuiProfile @GuiProfile
public class GetUserAccount extends RestCall<UserInfo> { public class GetUserAccount extends RestCall<UserInfo> {
protected GetUserAccount() { public GetUserAccount() {
super(new TypeKey<>( super(new TypeKey<>(
CallType.GET_SINGLE, CallType.GET_SINGLE,
EntityType.USER, EntityType.USER,

View file

@ -28,7 +28,7 @@ import ch.ethz.seb.sebserver.gui.service.remote.webservice.api.RestCall;
@GuiProfile @GuiProfile
public class GetUserAccountNames extends RestCall<List<EntityName>> { public class GetUserAccountNames extends RestCall<List<EntityName>> {
protected GetUserAccountNames() { public GetUserAccountNames() {
super(new TypeKey<>( super(new TypeKey<>(
CallType.GET_NAMES, CallType.GET_NAMES,
EntityType.USER, EntityType.USER,

View file

@ -27,7 +27,7 @@ import ch.ethz.seb.sebserver.gui.service.remote.webservice.api.RestCall;
@GuiProfile @GuiProfile
public class GetUserAccountPage extends RestCall<Page<UserInfo>> { public class GetUserAccountPage extends RestCall<Page<UserInfo>> {
protected GetUserAccountPage() { public GetUserAccountPage() {
super(new TypeKey<>( super(new TypeKey<>(
CallType.GET_PAGE, CallType.GET_PAGE,
EntityType.USER, EntityType.USER,

View file

@ -26,7 +26,7 @@ import ch.ethz.seb.sebserver.gui.service.remote.webservice.api.RestCall;
@GuiProfile @GuiProfile
public class NewUserAccount extends RestCall<UserInfo> { public class NewUserAccount extends RestCall<UserInfo> {
protected NewUserAccount() { public NewUserAccount() {
super(new TypeKey<>( super(new TypeKey<>(
CallType.NEW, CallType.NEW,
EntityType.USER, EntityType.USER,

View file

@ -26,7 +26,7 @@ import ch.ethz.seb.sebserver.gui.service.remote.webservice.api.RestCall;
@GuiProfile @GuiProfile
public class SaveUserAccount extends RestCall<UserInfo> { public class SaveUserAccount extends RestCall<UserInfo> {
protected SaveUserAccount() { public SaveUserAccount() {
super(new TypeKey<>( super(new TypeKey<>(
CallType.SAVE, CallType.SAVE,
EntityType.USER, EntityType.USER,

View file

@ -21,79 +21,31 @@ public final class ColumnDefinition<ROW extends Entity> {
final String columnName; final String columnName;
final LocTextKey displayName; final LocTextKey displayName;
final LocTextKey tooltip;
final int widthPercent;
final Function<ROW, ?> valueSupplier; final Function<ROW, ?> valueSupplier;
final boolean sortable;
final TableFilterAttribute filterAttribute; private LocTextKey tooltip;
final boolean localized; private int widthProportion;
private boolean sortable;
private TableFilterAttribute filterAttribute;
private boolean localized;
public ColumnDefinition(final String columnName, final LocTextKey displayName) { public ColumnDefinition(final String columnName, final LocTextKey displayName) {
this(columnName, displayName, null, -1); this(columnName, displayName, null);
} }
public ColumnDefinition( public ColumnDefinition(
final String columnName,
final LocTextKey displayName,
final Function<ROW, ?> valueSupplier) {
this(columnName, displayName, null, -1, valueSupplier, null, false, false);
}
private ColumnDefinition(
final String columnName, final String columnName,
final LocTextKey displayName, final LocTextKey displayName,
final LocTextKey tooltip, final LocTextKey tooltip,
final int widthPercent) { final int widthProportion,
this(columnName, displayName, tooltip, widthPercent, null, null, false, false);
}
public ColumnDefinition(
final String columnName,
final LocTextKey displayName,
final int widthPercent) {
this(columnName, displayName, null, widthPercent, null, null, false, false);
}
public ColumnDefinition(
final String columnName,
final LocTextKey displayName,
final Function<ROW, ?> valueSupplier,
final boolean sortable) {
this(columnName, displayName, null, -1, valueSupplier, null, sortable, false);
}
public ColumnDefinition(
final String columnName,
final LocTextKey displayName,
final Function<ROW, ?> valueSupplier,
final boolean sortable,
final boolean localized) {
this(columnName, displayName, null, -1, valueSupplier, null, sortable, localized);
}
public ColumnDefinition(
final String columnName,
final LocTextKey displayName,
final Function<ROW, ?> valueSupplier,
final TableFilterAttribute tableFilterAttribute,
final boolean sortable) {
this(columnName, displayName, null, -1, valueSupplier, tableFilterAttribute, sortable, false);
}
public ColumnDefinition(
final String columnName,
final LocTextKey displayName,
final Function<ROW, ?> valueSupplier,
final TableFilterAttribute tableFilterAttribute,
final boolean sortable,
final boolean localized) {
this(columnName, displayName, null, -1, valueSupplier, tableFilterAttribute, sortable, localized);
}
public ColumnDefinition(
final String columnName,
final LocTextKey displayName,
final LocTextKey tooltip,
final int widthPercent,
final Function<ROW, ?> valueSupplier, final Function<ROW, ?> valueSupplier,
final TableFilterAttribute filterAttribute, final TableFilterAttribute filterAttribute,
final boolean sortable, final boolean sortable,
@ -102,13 +54,58 @@ public final class ColumnDefinition<ROW extends Entity> {
this.columnName = columnName; this.columnName = columnName;
this.displayName = displayName; this.displayName = displayName;
this.tooltip = tooltip; this.tooltip = tooltip;
this.widthPercent = widthPercent; this.widthProportion = widthProportion;
this.valueSupplier = valueSupplier; this.valueSupplier = valueSupplier;
this.filterAttribute = filterAttribute; this.filterAttribute = filterAttribute;
this.sortable = sortable; this.sortable = sortable;
this.localized = localized; this.localized = localized;
} }
public ColumnDefinition<ROW> withFilter(final TableFilterAttribute filterAttribute) {
this.filterAttribute = filterAttribute;
return this;
}
public ColumnDefinition<ROW> withTooltip(final LocTextKey tooltip) {
this.tooltip = tooltip;
return this;
}
public ColumnDefinition<ROW> localized() {
this.localized = true;
return this;
}
public ColumnDefinition<ROW> sortable() {
this.sortable = true;
return this;
}
public ColumnDefinition<ROW> widthProportion(final int widthProportion) {
this.widthProportion = widthProportion;
return this;
}
public LocTextKey getTooltip() {
return this.tooltip;
}
public int getWidthProportion() {
return this.widthProportion;
}
public boolean isSortable() {
return this.sortable;
}
public TableFilterAttribute getFilterAttribute() {
return this.filterAttribute;
}
public boolean isLocalized() {
return this.localized;
}
public static final class TableFilterAttribute { public static final class TableFilterAttribute {
public final CriteriaType type; public final CriteriaType type;

View file

@ -110,7 +110,7 @@ public class EntityTable<ROW extends Entity> {
this.filter = this.filter =
columns columns
.stream() .stream()
.map(column -> column.filterAttribute) .map(column -> column.getFilterAttribute())
.filter(Objects::nonNull) .filter(Objects::nonNull)
.findFirst() .findFirst()
.isPresent() ? new TableFilter<>(this) : null; .isPresent() ? new TableFilter<>(this) : null;
@ -273,12 +273,12 @@ public class EntityTable<ROW extends Entity> {
final TableColumn tableColumn = this.widgetFactory.tableColumnLocalized( final TableColumn tableColumn = this.widgetFactory.tableColumnLocalized(
this.table, this.table,
column.displayName, column.displayName,
column.tooltip); column.getTooltip());
tableColumn.addListener(SWT.Resize, this::adaptColumnWidthChange); tableColumn.addListener(SWT.Resize, this::adaptColumnWidthChange);
tableColumn.setData(COLUMN_DEFINITION, column); tableColumn.setData(COLUMN_DEFINITION, column);
if (column.sortable) { if (column.isSortable()) {
tableColumn.addListener(SWT.Selection, event -> { tableColumn.addListener(SWT.Selection, event -> {
if (!column.columnName.equals(this.sortColumn)) { if (!column.columnName.equals(this.sortColumn)) {
applySort(column.columnName); applySort(column.columnName);
@ -292,7 +292,7 @@ public class EntityTable<ROW extends Entity> {
}); });
} }
if (column.widthPercent > 0) { if (column.getWidthProportion() > 0) {
this.columnsWithSameWidth = false; this.columnsWithSameWidth = false;
} }
} }
@ -355,14 +355,22 @@ public class EntityTable<ROW extends Entity> {
try { try {
final int currentTableWidth = this.table.getParent().getClientArea().width; final int currentTableWidth = this.table.getParent().getClientArea().width;
int index = 0; int index = 0;
final int pSize = this.columns
.stream()
.filter(c -> c.getWidthProportion() > 0)
.reduce(0,
(acc, c) -> acc + c.getWidthProportion(),
(acc1, acc2) -> acc1 + acc2);
final int columnSize = (pSize > 0)
? currentTableWidth / pSize
: currentTableWidth / this.columns.size();
for (final ColumnDefinition<ROW> column : this.columns) { for (final ColumnDefinition<ROW> column : this.columns) {
final int percentage = (this.columnsWithSameWidth)
? 100 / this.columns.size()
: column.widthPercent;
final TableColumn tableColumn = this.table.getColumn(index); final TableColumn tableColumn = this.table.getColumn(index);
final int newWidth = currentTableWidth / 100 * percentage; final int newWidth = (pSize > 0) ? columnSize * column.getWidthProportion() : columnSize;
tableColumn.setWidth(newWidth); tableColumn.setWidth(newWidth);
if (this.filter != null) { if (this.filter != null) {
this.filter.adaptColumnWidth(this.table.indexOf(tableColumn), newWidth); this.filter.adaptColumnWidth(this.table.indexOf(tableColumn), newWidth);
@ -401,7 +409,7 @@ public class EntityTable<ROW extends Entity> {
final TableColumn[] columns = table.table.getColumns(); final TableColumn[] columns = table.table.getColumns();
for (int i = 0; i < columns.length; i++) { for (int i = 0; i < columns.length; i++) {
final ColumnDefinition<ROW> columnDefinition = table.columns.get(i); final ColumnDefinition<ROW> columnDefinition = table.columns.get(i);
if (columnDefinition.localized) { if (columnDefinition.isLocalized()) {
for (int j = 0; j < items.length; j++) { for (int j = 0; j < items.length; j++) {
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
final ROW rowData = (ROW) items[j].getData(TABLE_ROW_DATA); final ROW rowData = (ROW) items[j].getData(TABLE_ROW_DATA);

View file

@ -82,10 +82,10 @@ public class TableFilter<ROW extends Entity> {
this.components.clear(); this.components.clear();
this.components.addAll(this.entityTable.columns this.components.addAll(this.entityTable.columns
.stream() .stream()
.map(column -> column.filterAttribute) .map(ColumnDefinition::getFilterAttribute)
.map(this::createFilterComponent) .map(this::createFilterComponent)
.map(comp -> comp.build(this.composite)) .map(comp -> comp.build(this.composite))
.map(comp -> comp.reset()) .map(FilterComponent::reset)
.collect(Collectors.toList())); .collect(Collectors.toList()));
final FilterComponent lastComp = this.components.get(this.components.size() - 1); final FilterComponent lastComp = this.components.get(this.components.size() - 1);

View file

@ -20,12 +20,12 @@ import java.util.UUID;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import org.apache.commons.io.IOUtils; import org.apache.commons.io.IOUtils;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Lazy; import org.springframework.context.annotation.Lazy;
import org.springframework.core.env.Environment;
import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.web.context.request.RequestAttributes; import org.springframework.web.context.request.RequestAttributes;
@ -55,41 +55,58 @@ import ch.ethz.seb.sebserver.webservice.servicelayer.sebconfig.impl.SebConfigEnc
@WebServiceProfile @WebServiceProfile
public class SebClientConfigServiceImpl implements SebClientConfigService { public class SebClientConfigServiceImpl implements SebClientConfigService {
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_SERVER_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 =
"sebserver.webservice.api.exam.endpoint.discovery";
private static final Logger log = LoggerFactory.getLogger(SebClientConfigServiceImpl.class); private static final Logger log = LoggerFactory.getLogger(SebClientConfigServiceImpl.class);
private final InstitutionDAO institutionDAO; private final InstitutionDAO institutionDAO;
private final SebClientConfigDAO sebClientConfigDAO; private final SebClientConfigDAO sebClientConfigDAO;
private final ClientCredentialService clientCredentialService; private final ClientCredentialService clientCredentialService;
private final SebConfigEncryptionService sebConfigEncryptionService; private final SebConfigEncryptionService sebConfigEncryptionService;
@Autowired private final PasswordEncoder clientPasswordEncoder;
@Qualifier(WebSecurityConfig.CLIENT_PASSWORD_ENCODER_BEAN_NAME)
private PasswordEncoder clientPasswordEncoder;
private final ZipService zipService; private final ZipService zipService;
private final String httpScheme; private final String httpScheme;
private final String serverAddress; private final String serverAddress;
private final String serverName;
private final String serverPort; private final String serverPort;
private final String discoveryEndpoint; private final String discoveryEndpoint;
private final String serverURLPrefix;
protected SebClientConfigServiceImpl( protected SebClientConfigServiceImpl(
final InstitutionDAO institutionDAO, final InstitutionDAO institutionDAO,
final SebClientConfigDAO sebClientConfigDAO, final SebClientConfigDAO sebClientConfigDAO,
final ClientCredentialService clientCredentialService, final ClientCredentialService clientCredentialService,
final SebConfigEncryptionService sebConfigEncryptionService, final SebConfigEncryptionService sebConfigEncryptionService,
final ZipService zipService, final ZipService zipService,
@Value("${sebserver.webservice.http.scheme}") final String httpScheme, @Qualifier(WebSecurityConfig.CLIENT_PASSWORD_ENCODER_BEAN_NAME) final PasswordEncoder clientPasswordEncoder,
@Value("${server.address}") final String serverAddress, final Environment environment) {
@Value("${server.port}") final String serverPort,
@Value("${sebserver.webservice.api.exam.endpoint.discovery}") final String discoveryEndpoint) {
this.institutionDAO = institutionDAO; this.institutionDAO = institutionDAO;
this.sebClientConfigDAO = sebClientConfigDAO; this.sebClientConfigDAO = sebClientConfigDAO;
this.clientCredentialService = clientCredentialService; this.clientCredentialService = clientCredentialService;
this.sebConfigEncryptionService = sebConfigEncryptionService; this.sebConfigEncryptionService = sebConfigEncryptionService;
this.zipService = zipService; this.zipService = zipService;
this.httpScheme = httpScheme; this.clientPasswordEncoder = clientPasswordEncoder;
this.serverAddress = serverAddress;
this.serverPort = serverPort; this.httpScheme = environment.getRequiredProperty(WEB_SERVICE_HTTP_SCHEME_KEY);
this.discoveryEndpoint = discoveryEndpoint; this.serverAddress = environment.getRequiredProperty(WEB_SERVICE_SERVER_ADDRESS_KEY);
this.serverName = environment.getProperty(WEB_SERVICE_SERVER_NAME_KEY, (String) null);
this.serverPort = environment.getRequiredProperty(WEB_SERVICE_SERVER_PORT_KEY);
this.discoveryEndpoint = environment.getRequiredProperty(WEB_SERVICE_EXAM_API_DISCOVERY_ENDPOINT_KEY);
this.serverURLPrefix = UriComponentsBuilder.newInstance()
.scheme(this.httpScheme)
.host((StringUtils.isNoneBlank(this.serverName))
? this.serverName
: this.serverAddress)
.port(this.serverPort)
.toUriString();
} }
@Override @Override
@ -236,11 +253,7 @@ public class SebClientConfigServiceImpl implements SebClientConfigService {
@Override @Override
public String getServerURL() { public String getServerURL() {
return UriComponentsBuilder.newInstance() return this.serverURLPrefix;
.scheme(this.httpScheme)
.host(this.serverAddress)
.port(this.serverPort)
.toUriString();
} }
private void passwordEncryption( private void passwordEncryption(

View file

@ -43,37 +43,39 @@ public class ExamAPIDiscoveryController {
@PostConstruct @PostConstruct
void init() { void init() {
final String serverURL = this.sebClientConfigService.getServerURL();
this.DISCOVERY_INFO = new ExamAPIDiscovery( this.DISCOVERY_INFO = new ExamAPIDiscovery(
"Safe Exam Browser Server / Exam API Description", "Safe Exam Browser Server / Exam API Description",
"This is a description of Safe Exam Browser Server's Exam API", "This is a description of Safe Exam Browser Server's Exam API",
this.sebClientConfigService.getServerURL(), serverURL,
Arrays.asList(new ExamAPIDiscovery.ExamAPIVersion( Arrays.asList(new ExamAPIDiscovery.ExamAPIVersion(
"v1", "v1",
Arrays.asList( Arrays.asList(
new ExamAPIDiscovery.Endpoint( new ExamAPIDiscovery.Endpoint(
"access-token-endpoint", "access-token-endpoint",
"request OAuth2 access token with client credentials grant", "request OAuth2 access token with client credentials grant",
API.OAUTH_TOKEN_ENDPOINT, serverURL + API.OAUTH_TOKEN_ENDPOINT,
"Basic"), "Basic"),
new ExamAPIDiscovery.Endpoint( new ExamAPIDiscovery.Endpoint(
"seb-handshake-endpoint", "seb-handshake-endpoint",
"endpoint to establish SEB - SEB Server connection", "endpoint to establish SEB - SEB Server connection",
this.examAPI_V1_Endpoint + API.EXAM_API_HANDSHAKE_ENDPOINT, serverURL + this.examAPI_V1_Endpoint + API.EXAM_API_HANDSHAKE_ENDPOINT,
"Bearer"), "Bearer"),
new ExamAPIDiscovery.Endpoint( new ExamAPIDiscovery.Endpoint(
"seb-configuration-endpoint", "seb-configuration-endpoint",
"endpoint to get SEB exam configuration in exchange of connection-token and exam identifier", "endpoint to get SEB exam configuration in exchange of connection-token and exam identifier",
this.examAPI_V1_Endpoint + API.EXAM_API_CONFIGURATION_REQUEST_ENDPOINT, serverURL + this.examAPI_V1_Endpoint
+ API.EXAM_API_CONFIGURATION_REQUEST_ENDPOINT,
"Bearer"), "Bearer"),
new ExamAPIDiscovery.Endpoint( new ExamAPIDiscovery.Endpoint(
"seb-ping-endpoint", "seb-ping-endpoint",
"endpoint to send pings to while running exam", "endpoint to send pings to while running exam",
this.examAPI_V1_Endpoint + API.EXAM_API_PING_ENDPOINT, serverURL + this.examAPI_V1_Endpoint + API.EXAM_API_PING_ENDPOINT,
"Bearer"), "Bearer"),
new ExamAPIDiscovery.Endpoint( new ExamAPIDiscovery.Endpoint(
"seb-ping-endpoint", "seb-ping-endpoint",
"endpoint to send log events to while running exam", "endpoint to send log events to while running exam",
this.examAPI_V1_Endpoint + API.EXAM_API_EVENT_ENDPOINT, serverURL + this.examAPI_V1_Endpoint + API.EXAM_API_EVENT_ENDPOINT,
"Bearer"))))); "Bearer")))));
} }

View file

@ -10,6 +10,7 @@ spring.datasource.platform=dev
spring.datasource.hikari.max-lifetime=600000 spring.datasource.hikari.max-lifetime=600000
sebserver.webservice.http.scheme=http sebserver.webservice.http.scheme=http
sebserver.webservice.http.server.name=localhost
sebserver.webservice.api.admin.endpoint=/admin-api/v1 sebserver.webservice.api.admin.endpoint=/admin-api/v1
sebserver.webservice.api.admin.accessTokenValiditySeconds=1800 sebserver.webservice.api.admin.accessTokenValiditySeconds=1800
sebserver.webservice.api.admin.refreshTokenValiditySeconds=-1 sebserver.webservice.api.admin.refreshTokenValiditySeconds=-1

View file

@ -6,7 +6,7 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/. * file, You can obtain one at http://mozilla.org/MPL/2.0/.
*/ */
package ch.ethz.seb.sebserver.gui.service.remote.webservice.api.seb.clientconfig; package ch.ethz.seb.sebserver.gui.integration;
import static org.junit.Assert.*; import static org.junit.Assert.*;
@ -18,8 +18,12 @@ import ch.ethz.seb.sebserver.gbl.model.Domain;
import ch.ethz.seb.sebserver.gbl.model.EntityProcessingReport; import ch.ethz.seb.sebserver.gbl.model.EntityProcessingReport;
import ch.ethz.seb.sebserver.gbl.model.sebconfig.SebClientConfig; import ch.ethz.seb.sebserver.gbl.model.sebconfig.SebClientConfig;
import ch.ethz.seb.sebserver.gbl.util.Result; import ch.ethz.seb.sebserver.gbl.util.Result;
import ch.ethz.seb.sebserver.gui.integration.GuiIntegrationTest;
import ch.ethz.seb.sebserver.gui.service.remote.webservice.api.RestServiceImpl; import ch.ethz.seb.sebserver.gui.service.remote.webservice.api.RestServiceImpl;
import ch.ethz.seb.sebserver.gui.service.remote.webservice.api.seb.clientconfig.ActivateClientConfig;
import ch.ethz.seb.sebserver.gui.service.remote.webservice.api.seb.clientconfig.DeactivateClientConfig;
import ch.ethz.seb.sebserver.gui.service.remote.webservice.api.seb.clientconfig.GetClientConfig;
import ch.ethz.seb.sebserver.gui.service.remote.webservice.api.seb.clientconfig.NewClientConfig;
import ch.ethz.seb.sebserver.gui.service.remote.webservice.api.seb.clientconfig.SaveClientConfig;
@Sql(scripts = { "classpath:schema-test.sql", "classpath:data-test.sql" }) @Sql(scripts = { "classpath:schema-test.sql", "classpath:data-test.sql" })
public class ClientConfigTest extends GuiIntegrationTest { public class ClientConfigTest extends GuiIntegrationTest {

View file

@ -6,7 +6,7 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/. * file, You can obtain one at http://mozilla.org/MPL/2.0/.
*/ */
package ch.ethz.seb.sebserver.gui.service.remote.webservice.api.institution; package ch.ethz.seb.sebserver.gui.integration;
import static org.junit.Assert.*; import static org.junit.Assert.*;
@ -14,16 +14,18 @@ import java.util.ArrayList;
import java.util.Collection; import java.util.Collection;
import org.junit.Test; import org.junit.Test;
import org.springframework.test.context.jdbc.Sql;
import ch.ethz.seb.sebserver.gbl.api.API; import ch.ethz.seb.sebserver.gbl.api.API;
import ch.ethz.seb.sebserver.gbl.api.JSONMapper; import ch.ethz.seb.sebserver.gbl.api.JSONMapper;
import ch.ethz.seb.sebserver.gbl.model.institution.Institution; import ch.ethz.seb.sebserver.gbl.model.institution.Institution;
import ch.ethz.seb.sebserver.gbl.util.Result; import ch.ethz.seb.sebserver.gbl.util.Result;
import ch.ethz.seb.sebserver.gui.integration.GuiIntegrationTest;
import ch.ethz.seb.sebserver.gui.service.remote.webservice.api.RestCall; import ch.ethz.seb.sebserver.gui.service.remote.webservice.api.RestCall;
import ch.ethz.seb.sebserver.gui.service.remote.webservice.api.RestServiceImpl; import ch.ethz.seb.sebserver.gui.service.remote.webservice.api.RestServiceImpl;
import ch.ethz.seb.sebserver.gui.service.remote.webservice.api.institution.GetInstitution;
import ch.ethz.seb.sebserver.gui.service.remote.webservice.auth.OAuth2AuthorizationContextHolder; import ch.ethz.seb.sebserver.gui.service.remote.webservice.auth.OAuth2AuthorizationContextHolder;
@Sql(scripts = { "classpath:schema-test.sql", "classpath:data-test.sql" })
public class GetInstitutionTest extends GuiIntegrationTest { public class GetInstitutionTest extends GuiIntegrationTest {
@Test @Test

View file

@ -0,0 +1,77 @@
/*
* 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.integration;
import static org.junit.Assert.*;
import org.junit.Test;
import org.springframework.test.context.jdbc.Sql;
import ch.ethz.seb.sebserver.gbl.api.API;
import ch.ethz.seb.sebserver.gbl.model.Domain;
import ch.ethz.seb.sebserver.gbl.model.EntityProcessingReport;
import ch.ethz.seb.sebserver.gbl.model.institution.Institution;
import ch.ethz.seb.sebserver.gbl.util.Result;
import ch.ethz.seb.sebserver.gui.service.remote.webservice.api.RestServiceImpl;
import ch.ethz.seb.sebserver.gui.service.remote.webservice.api.institution.ActivateInstitution;
import ch.ethz.seb.sebserver.gui.service.remote.webservice.api.institution.GetInstitution;
import ch.ethz.seb.sebserver.gui.service.remote.webservice.api.institution.NewInstitution;
@Sql(scripts = { "classpath:schema-test.sql", "classpath:data-test.sql" })
public class UseCasesIntegrationTest extends GuiIntegrationTest {
@Test
public void bigUseCasesTest() {
// *************************************
// Use Case 1: SEB Administrator creates a new institution and activate this new institution
final RestServiceImpl restService = createRestServiceForUser(
"admin",
"admin",
new NewInstitution(),
new ActivateInstitution(),
new GetInstitution());
final Result<Institution> result = restService.getBuilder(NewInstitution.class)
.withQueryParam(Domain.INSTITUTION.ATTR_NAME, "Test Institution")
.call();
assertNotNull(result);
assertFalse(result.hasError());
Institution institution = result.get();
assertEquals("Test Institution", institution.name);
assertFalse(institution.active);
final Result<EntityProcessingReport> resultActivation = restService.getBuilder(ActivateInstitution.class)
.withURIVariable(API.PARAM_MODEL_ID, String.valueOf(institution.id))
.call();
assertNotNull(resultActivation);
assertFalse(resultActivation.hasError());
final Result<Institution> resultGet = restService.getBuilder(GetInstitution.class)
.withURIVariable(API.PARAM_MODEL_ID, String.valueOf(institution.id))
.call();
assertNotNull(resultGet);
assertFalse(resultGet.hasError());
institution = resultGet.get();
assertEquals("Test Institution", institution.name);
assertTrue(institution.active);
// *************************************
// Use Case 2: SEB Administrator creates a new Institutional Administrator user for the
// newly created institution and activate this user
// TODO do as much use cases as possible within this integration test
}
}

View file

@ -8,7 +8,7 @@
package ch.ethz.seb.sebserver.webservice.integration.api.exam; package ch.ethz.seb.sebserver.webservice.integration.api.exam;
import static org.junit.Assert.assertEquals; import static org.junit.Assert.*;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
@ -16,6 +16,8 @@ import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.annotation.Value;
import ch.ethz.seb.sebserver.gbl.api.ExamAPIDiscovery;
import ch.ethz.seb.sebserver.gbl.api.ExamAPIDiscovery.ExamAPIVersion;
import ch.ethz.seb.sebserver.gbl.api.JSONMapper; import ch.ethz.seb.sebserver.gbl.api.JSONMapper;
public class ExamDiscoveryEndpointTest extends ExamAPIIntegrationTester { public class ExamDiscoveryEndpointTest extends ExamAPIIntegrationTester {
@ -33,44 +35,14 @@ public class ExamDiscoveryEndpointTest extends ExamAPIIntegrationTester {
.andExpect(status().isOk()) .andExpect(status().isOk())
.andReturn().getResponse().getContentAsString(); .andReturn().getResponse().getContentAsString();
final Object json = this.jsonMapper.readValue(contentAsString, Object.class); final ExamAPIDiscovery examAPIDiscovery = this.jsonMapper.readValue(contentAsString, ExamAPIDiscovery.class);
assertEquals( assertNotNull(examAPIDiscovery);
"{\r\n" + assertEquals("Safe Exam Browser Server / Exam API Description", examAPIDiscovery.title);
" \"title\" : \"Safe Exam Browser Server / Exam API Description\",\r\n" + assertEquals("This is a description of Safe Exam Browser Server's Exam API", examAPIDiscovery.description);
" \"description\" : \"This is a description of Safe Exam Browser Server's Exam API\",\r\n" + assertTrue(!examAPIDiscovery.versions.isEmpty());
" \"server-location\" : \"http://localhost:0\",\r\n" + final ExamAPIVersion version1 = examAPIDiscovery.versions.iterator().next();
" \"api-versions\" : [ {\r\n" + assertEquals("v1", version1.name);
" \"name\" : \"v1\",\r\n" + assertTrue(!version1.endpoints.isEmpty());
" \"endpoints\" : [ {\r\n" +
" \"name\" : \"access-token-endpoint\",\r\n" +
" \"descripiton\" : \"request OAuth2 access token with client credentials grant\",\r\n" +
" \"location\" : \"/oauth/token\",\r\n" +
" \"authorization\" : \"Basic\"\r\n" +
" }, {\r\n" +
" \"name\" : \"seb-handshake-endpoint\",\r\n" +
" \"descripiton\" : \"endpoint to establish SEB - SEB Server connection\",\r\n" +
" \"location\" : \"/exam-api/v1/handshake\",\r\n" +
" \"authorization\" : \"Bearer\"\r\n" +
" }, {\r\n" +
" \"name\" : \"seb-configuration-endpoint\",\r\n" +
" \"descripiton\" : \"endpoint to get SEB exam configuration in exchange of connection-token and exam identifier\",\r\n"
+
" \"location\" : \"/exam-api/v1/examconfig\",\r\n" +
" \"authorization\" : \"Bearer\"\r\n" +
" }, {\r\n" +
" \"name\" : \"seb-ping-endpoint\",\r\n" +
" \"descripiton\" : \"endpoint to send pings to while running exam\",\r\n" +
" \"location\" : \"/exam-api/v1/sebping\",\r\n" +
" \"authorization\" : \"Bearer\"\r\n" +
" }, {\r\n" +
" \"name\" : \"seb-ping-endpoint\",\r\n" +
" \"descripiton\" : \"endpoint to send log events to while running exam\",\r\n" +
" \"location\" : \"/exam-api/v1/seblog\",\r\n" +
" \"authorization\" : \"Bearer\"\r\n" +
" } ]\r\n" +
" } ]\r\n" +
"}",
this.jsonMapper.writerWithDefaultPrettyPrinter().writeValueAsString(json));
} }
} }