minor fixes and tables
This commit is contained in:
		
							parent
							
								
									bbb15bba40
								
							
						
					
					
						commit
						652de887a5
					
				
					 93 changed files with 407 additions and 323 deletions
				
			
		| 
						 | 
					@ -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;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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())
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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());
 | 
				
			||||||
        ;
 | 
					        ;
 | 
				
			||||||
 | 
					 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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())
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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()))
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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())
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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())
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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())
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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(
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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")))));
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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 {
 | 
				
			||||||
| 
						 | 
					@ -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
 | 
				
			||||||
| 
						 | 
					@ -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
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -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));
 | 
					 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		
		Reference in a new issue