code cleanup
This commit is contained in:
		
							parent
							
								
									0b86af5859
								
							
						
					
					
						commit
						ae9fd0636a
					
				
					 27 changed files with 40 additions and 229 deletions
				
			
		|  | @ -29,7 +29,7 @@ public enum PrivilegeType { | |||
|      * and so on. | ||||
|      * | ||||
|      * @param type the PrivilegeType | ||||
|      * @return true if given PrivilegeType is implicit form this PrivilegeType */ | ||||
|      * @return true if given PrivilegeType is implicit from this PrivilegeType */ | ||||
|     public boolean hasImplicit(final PrivilegeType type) { | ||||
|         if (type == null) { | ||||
|             return false; | ||||
|  |  | |||
|  | @ -36,7 +36,7 @@ public class AsyncService { | |||
|      * | ||||
|      * @param maxFailingAttempts maximal number of attempts the CircuitBreaker allows before going onto open state. | ||||
|      * @param maxBlockingTime maximal time since call CircuitBreaker waits for a response before going onto open state. | ||||
|      * @param timeToRecover the time the CircuitBreaker takes to recover form open state. | ||||
|      * @param timeToRecover the time the CircuitBreaker takes to recover from open state. | ||||
|      * @param <T> the type of the CircuitBreaker | ||||
|      * @return a CircuitBreaker of specified type */ | ||||
|     public <T> CircuitBreaker<T> createCircuitBreaker( | ||||
|  | @ -57,7 +57,7 @@ public class AsyncService { | |||
|      * @param blockingSupplier the blocking result supplier that the MemoizingCircuitBreaker must call | ||||
|      * @param maxFailingAttempts maximal number of attempts the CircuitBreaker allows before going onto open state. | ||||
|      * @param maxBlockingTime maximal time since call CircuitBreaker waits for a response before going onto open state. | ||||
|      * @param timeToRecover the time the CircuitBreaker takes to recover form open state. | ||||
|      * @param timeToRecover the time the CircuitBreaker takes to recover from open state. | ||||
|      * @param momoized whether the memoizing functionality is on or off | ||||
|      * @param maxMemoizingTime the maximal time memorized data is valid | ||||
|      * @param <T> the type of the CircuitBreaker | ||||
|  |  | |||
|  | @ -94,7 +94,7 @@ public final class MemoizingCircuitBreaker<T> implements Supplier<Result<T>> { | |||
|      * | ||||
|      * @param asyncRunner the AsyncRunner used to create asynchronous calls on the given supplier function | ||||
|      * @param supplier The Supplier function that can fail or block for a long time | ||||
|      * @param maxFailingAttempts the number of maximal failing attempts before go form CLOSE into HALF_OPEN state | ||||
|      * @param maxFailingAttempts the number of maximal failing attempts before go from CLOSE into HALF_OPEN state | ||||
|      * @param maxBlockingTime the maximal time that an call attempt can block until an error is responded | ||||
|      * @param timeToRecover the time the circuit breaker needs to cool-down on OPEN-STATE before going back to HALF_OPEN | ||||
|      *            state | ||||
|  |  | |||
|  | @ -55,13 +55,13 @@ public interface ClientCredentialService { | |||
|         return encryptClientCredentials(clientIdPlaintext, secretPlaintext, null); | ||||
|     } | ||||
| 
 | ||||
|     /** Use this to get a decrypted plain text secret form given ClientCredentials | ||||
|     /** Use this to get a decrypted plain text secret from given ClientCredentials | ||||
|      * | ||||
|      * @param credentials ClientCredentials containing the secret to decrypt | ||||
|      * @return decrypted plain text secret */ | ||||
|     Result<CharSequence> getPlainClientSecret(ClientCredentials credentials); | ||||
| 
 | ||||
|     /** Use this to get a decrypted plain text accessToken form given ClientCredentials | ||||
|     /** Use this to get a decrypted plain text accessToken from given ClientCredentials | ||||
|      * | ||||
|      * @param credentials ClientCredentials containing the accessToken to decrypt | ||||
|      * @return decrypted plain text accessToken */ | ||||
|  |  | |||
|  | @ -48,7 +48,7 @@ public interface Entity extends ModelIdAware { | |||
| 
 | ||||
|     /** Creates an EntityName instance from this Entity instance. | ||||
|      * | ||||
|      * @return EntityName instance created form given Entity */ | ||||
|      * @return EntityName instance created from given Entity */ | ||||
|     default EntityName toName() { | ||||
|         return new EntityName( | ||||
|                 this.getModelId(), | ||||
|  |  | |||
|  | @ -231,7 +231,7 @@ public final class InstitutionalAuthenticationEntryPoint implements Authenticati | |||
|             final Object attribute = RWT.getUISession().getHttpSession().getAttribute(INST_SUFFIX_ATTRIBUTE); | ||||
|             return (attribute != null) ? String.valueOf(attribute) : null; | ||||
|         } catch (final Exception e) { | ||||
|             log.warn("Failed to extract institutional endpoint form user session: {}", e.getMessage()); | ||||
|             log.warn("Failed to extract institutional endpoint from user session: {}", e.getMessage()); | ||||
|             return null; | ||||
|         } | ||||
|     } | ||||
|  |  | |||
|  | @ -108,7 +108,7 @@ public class SEBExamConfigBatchStateChangePopup extends AbstractBatchActionWizar | |||
| 
 | ||||
|         final String targetStateName = pageContext.getAttribute(ATTR_SELECTED_TARGET_STATE); | ||||
|         if (StringUtils.isBlank(targetStateName)) { | ||||
|             throw new IllegalArgumentException("missing " + ATTR_SELECTED_TARGET_STATE + " form pageContext"); | ||||
|             throw new IllegalArgumentException("missing " + ATTR_SELECTED_TARGET_STATE + " from pageContext"); | ||||
|         } | ||||
| 
 | ||||
|         batchActionRequestBuilder.withFormParam(BatchAction.ACTION_ATTRIBUT_TARGET_STATE, targetStateName); | ||||
|  |  | |||
|  | @ -70,7 +70,7 @@ public final class Form implements FormBinding { | |||
|             flush(); | ||||
|             return this.jsonMapper.writeValueAsString(this.objectRoot); | ||||
|         } catch (final Exception e) { | ||||
|             throw new RuntimeException("Unexpected error while trying to create json form Form post: ", e); | ||||
|             throw new RuntimeException("Unexpected error while trying to create json from form post: ", e); | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|  |  | |||
|  | @ -168,7 +168,7 @@ public class TableFieldBuilder extends AbstractTableFieldBuilder { | |||
| 
 | ||||
|         private void addRow() { | ||||
|             final int index = this.values.size(); | ||||
|             // create new values form default values | ||||
|             // create new values from default values | ||||
|             final Map<Long, TableValue> rowValues = this.tableContext.getRowAttributes() | ||||
|                     .stream() | ||||
|                     .map(attr -> new TableValue(attr.id, index, attr.defaultValue)) | ||||
|  |  | |||
|  | @ -43,7 +43,7 @@ public interface I18nSupport { | |||
|      * This uses the date-format defined by either the attribute 'sebserver.gui.date.display format' | ||||
|      * or the Constants.DEFAULT_DISPLAY_DATE_FORMAT | ||||
|      * | ||||
|      * Adds time-zone offset information if the currents user time-zone is different form UTC | ||||
|      * Adds time-zone offset information if the currents user time-zone is different from UTC | ||||
|      * | ||||
|      * @param date the DateTime instance | ||||
|      * @return date formatted date String to display */ | ||||
|  | @ -53,7 +53,7 @@ public interface I18nSupport { | |||
|      * This uses the date-format defined by either the attribute 'sebserver.gui.date.display format' | ||||
|      * or the Constants.DEFAULT_DISPLAY_DATE_FORMAT | ||||
|      * | ||||
|      * Adds time-zone offset information if the currents user time-zone is different form UTC | ||||
|      * Adds time-zone offset information if the currents user time-zone is different from UTC | ||||
|      * | ||||
|      * @param date the DateTime instance | ||||
|      * @return date formatted date String to display */ | ||||
|  | @ -65,7 +65,7 @@ public interface I18nSupport { | |||
|      * This uses the date-format defined by either the attribute 'sebserver.gui.date.display format' | ||||
|      * or the Constants.DEFAULT_DISPLAY_DATE_FORMAT | ||||
|      * | ||||
|      * Adds time-zone information if the currents user time-zone is different form UTC | ||||
|      * Adds time-zone information if the currents user time-zone is different from UTC | ||||
|      * | ||||
|      * @param timestamp the unix-timestamp in milliseconds | ||||
|      * @return date formatted date String to display */ | ||||
|  | @ -77,7 +77,7 @@ public interface I18nSupport { | |||
|      * This uses the date-format defined by either the attribute 'sebserver.gui.datetime.display format' | ||||
|      * or the Constants.DEFAULT_DISPLAY_DATE_TIME_FORMAT | ||||
|      * | ||||
|      * Adds time-zone information if the currents user time-zone is different form UTC | ||||
|      * Adds time-zone information if the currents user time-zone is different from UTC | ||||
|      * | ||||
|      * @param date the DateTime instance | ||||
|      * @return date formatted date time String to display */ | ||||
|  | @ -87,7 +87,7 @@ public interface I18nSupport { | |||
|      * This uses the date-format defined by either the attribute 'sebserver.gui.datetime.display format' | ||||
|      * or the Constants.DEFAULT_DISPLAY_DATE_TIME_FORMAT | ||||
|      * | ||||
|      * Adds time-zone information if the currents user time-zone is different form UTC | ||||
|      * Adds time-zone information if the currents user time-zone is different from UTC | ||||
|      * | ||||
|      * @param timestamp the unix-timestamp in milliseconds | ||||
|      * @return date formatted date time String to display */ | ||||
|  | @ -99,7 +99,7 @@ public interface I18nSupport { | |||
|      * This uses the date-format defined by either the attribute 'sebserver.gui.time.display format' | ||||
|      * or the Constants.DEFAULT_DISPLAY_TIME_FORMAT | ||||
|      * | ||||
|      * Adds time-zone information if the currents user time-zone is different form UTC | ||||
|      * Adds time-zone information if the currents user time-zone is different from UTC | ||||
|      * | ||||
|      * @param date the DateTime instance | ||||
|      * @return date formatted time String to display */ | ||||
|  | @ -109,7 +109,7 @@ public interface I18nSupport { | |||
|      * This uses the date-format defined by either the attribute 'sebserver.gui.time.display format' | ||||
|      * or the Constants.DEFAULT_DISPLAY_TIME_FORMAT | ||||
|      * | ||||
|      * Adds time-zone information if the currents user time-zone is different form UTC | ||||
|      * Adds time-zone information if the currents user time-zone is different from UTC | ||||
|      * | ||||
|      * @param timestamp the unix-timestamp in milliseconds | ||||
|      * @return date formatted time String to display */ | ||||
|  |  | |||
|  | @ -716,7 +716,7 @@ public class EntityTable<ROW extends ModelIdAware> { | |||
|                 return 1; | ||||
|             } | ||||
|         } catch (final Exception e) { | ||||
|             log.error("Failed to get sort attribute form current user attributes", e); | ||||
|             log.error("Failed to get sort attribute from current user attributes", e); | ||||
|             return 1; | ||||
|         } | ||||
|     } | ||||
|  | @ -757,7 +757,7 @@ public class EntityTable<ROW extends ModelIdAware> { | |||
|             setTableSort(); | ||||
| 
 | ||||
|         } catch (final Exception e) { | ||||
|             log.error("Failed to get sort attribute form current user attributes", e); | ||||
|             log.error("Failed to get sort attribute from current user attributes", e); | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|  | @ -794,7 +794,7 @@ public class EntityTable<ROW extends ModelIdAware> { | |||
|                                 .getCurrentUser() | ||||
|                                 .getAttribute(this.filterAttrName)); | ||||
|             } catch (final Exception e) { | ||||
|                 log.error("Failed to get filter attributes form current user attributes", e); | ||||
|                 log.error("Failed to get filter attributes from current user attributes", e); | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|  |  | |||
|  | @ -233,7 +233,7 @@ public class WebserviceInfo { | |||
|         return InetAddress.getLoopbackAddress().getHostAddress(); | ||||
|     } | ||||
| 
 | ||||
|     /** Get the server URL prefix in form of; | ||||
|     /** Get the server URL prefix in the form of; | ||||
|      * [scheme{http|https}]://[server-address{DNS-name|IP}]:[port] | ||||
|      * | ||||
|      * E.g.: https://seb.server.ch:8080 | ||||
|  |  | |||
|  | @ -19,7 +19,7 @@ import ch.ethz.seb.sebserver.gbl.model.Entity; | |||
| import ch.ethz.seb.sebserver.gbl.model.Page; | ||||
| import ch.ethz.seb.sebserver.gbl.util.Result; | ||||
| 
 | ||||
| /** A service to apply pagination functionality within collection results form data access layer. | ||||
| /** A service to apply pagination functionality within collection results from data access layer. | ||||
|  * The default implementation uses Mybatis-PageHelper to apply the pagination on SQL level where possible: | ||||
|  * https://github.com/pagehelper/Mybatis-PageHelper */ | ||||
| 
 | ||||
|  |  | |||
|  | @ -56,7 +56,7 @@ public interface BulkActionService { | |||
|      * If the given BulkAction has not already been executed, it will be executed first | ||||
|      * | ||||
|      * @param action the BulkAction of a concrete type | ||||
|      * @return EntityProcessingReport extracted form an executed BulkAction */ | ||||
|      * @return EntityProcessingReport extracted from an executed BulkAction */ | ||||
|     Result<EntityProcessingReport> createReport(BulkAction action); | ||||
| 
 | ||||
| } | ||||
|  | @ -45,7 +45,7 @@ public interface ClientInstructionDAO { | |||
|      * @return Collection of all active instructions for specified connection token */ | ||||
|     Result<Collection<ClientInstructionRecord>> getAllActive(String connectionToken); | ||||
| 
 | ||||
|     /** Deletes all old instructions form the persistent storage to clean-up. | ||||
|     /** Deletes all old instructions from the persistent storage to clean-up. | ||||
|      * Old in this case means the timestamp is older then one minute or a configured time interval | ||||
|      * | ||||
|      * @param timestamp the time-stamp (milliseconds) of the time in the past from that earlier instructions are | ||||
|  | @ -53,7 +53,7 @@ public interface ClientInstructionDAO { | |||
|      * @return Result collection of keys of deleted entities or refer to an error when happened */ | ||||
|     Result<Collection<EntityKey>> deleteAllInactive(long timestamp); | ||||
| 
 | ||||
|     /** Deletes the specified instruction form the data base | ||||
|     /** Deletes the specified instruction from the data base | ||||
|      * | ||||
|      * @param id the identifier (PK) if the ClientInstruction to delete | ||||
|      * @return Void Result refer to an error if happened */ | ||||
|  |  | |||
|  | @ -38,7 +38,7 @@ public interface ConfigurationDAO extends EntityDAO<Configuration, Configuration | |||
|     /** Saves the current follow-up Configuration of the ConfigurationNode of given id | ||||
|      * as a point in history and creates new new follow-up Configuration. | ||||
|      * | ||||
|      * @param configurationNodeId the identifier of the ConfigurationNode to create a new history entry form current | ||||
|      * @param configurationNodeId the identifier of the ConfigurationNode to create a new history entry from current | ||||
|      *            follow-up | ||||
|      * @return the new follow-up Configuration model */ | ||||
|     Result<Configuration> saveToHistory(Long configurationNodeId); | ||||
|  |  | |||
|  | @ -148,14 +148,14 @@ public interface EntityDAO<T extends Entity, M extends ModelIdAware> { | |||
|      * @return Result referring to collection of all matching entities or an error if happened */ | ||||
|     Result<Collection<T>> allMatching(FilterMap filterMap, Predicate<T> predicate); | ||||
| 
 | ||||
|     /** Context based utility method to extract an expected single resource entry form a Collection of specified type. | ||||
|      * Gets a Result refer to an expected single resource entry form a Collection of specified type or refer | ||||
|     /** Context based utility method to extract an expected single resource entry from a Collection of specified type. | ||||
|      * Gets a Result refer to an expected single resource entry from a Collection of specified type or refer | ||||
|      * to a ResourceNotFoundException if specified collection is null or empty or refer to a | ||||
|      * unexpected RuntimeException if there are more then the expected single element in the given collection | ||||
|      * | ||||
|      * @param id The resource id to wrap within a ResourceNotFoundException if needed | ||||
|      * @param resources the collection of resource entries | ||||
|      * @return Result refer to an expected single resource entry form a Collection of specified type or refer to an | ||||
|      * @return Result refer to an expected single resource entry from a Collection of specified type or refer to an | ||||
|      *         error if happened */ | ||||
|     default <R> Result<R> getSingleResource(final String id, final Collection<R> resources) { | ||||
| 
 | ||||
|  |  | |||
|  | @ -89,7 +89,7 @@ public interface ExamDAO extends ActivatableEntityDAO<Exam, Exam>, BulkActionSup | |||
|             final Predicate<Exam> predicate, | ||||
|             final ExamStatus... status); | ||||
| 
 | ||||
|     /** Gets all for active and none archived exams within the system, independently form institution and LMSSetup. | ||||
|     /** Gets all for active and none archived exams within the system, independently from institution and LMSSetup. | ||||
|      * | ||||
|      * @return Result refer to all exams for LMS update or to an error when happened */ | ||||
|     Result<Collection<Exam>> allForLMSUpdate(); | ||||
|  |  | |||
|  | @ -239,7 +239,7 @@ public class CertificateDAOImpl implements CertificateDAO { | |||
|                 return dn.replace(" ", "_").toLowerCase(); | ||||
|             } | ||||
|         } catch (final CertificateEncodingException e) { | ||||
|             log.warn("Error while trying to get alias form certificate subject name. Use serial number as alias"); | ||||
|             log.warn("Error while trying to get alias from certificate subject name. Use serial number as alias"); | ||||
|             return String.valueOf(certificate.getSerialNumber()); | ||||
|         } | ||||
|     } | ||||
|  |  | |||
|  | @ -187,9 +187,9 @@ public class ExamDAOImpl implements ExamDAO { | |||
|     public void markLMSAvailability(final String externalQuizId, final boolean available, final String updateId) { | ||||
| 
 | ||||
|         if (!available) { | ||||
|             log.info("Mark exam quiz data not available form LMS: {}", externalQuizId); | ||||
|             log.info("Mark exam quiz data not available from LMS: {}", externalQuizId); | ||||
|         } else { | ||||
|             log.info("Mark exam quiz data back again form LMS: {}", externalQuizId); | ||||
|             log.info("Mark exam quiz data back again from LMS: {}", externalQuizId); | ||||
|         } | ||||
| 
 | ||||
|         this.examRecordDAO.idByExternalQuizId(externalQuizId) | ||||
|  |  | |||
|  | @ -127,7 +127,7 @@ public class ExamTemplateServiceImpl implements ExamTemplateService { | |||
|                     if (exam.examTemplateId != null) { | ||||
| 
 | ||||
|                         if (log.isDebugEnabled()) { | ||||
|                             log.debug("Init exam: {} with additional attributes form exam template: {}", | ||||
|                             log.debug("Init exam: {} with additional attributes from exam template: {}", | ||||
|                                     exam.externalId, | ||||
|                                     exam.examTemplateId); | ||||
|                         } | ||||
|  |  | |||
|  | @ -60,7 +60,7 @@ public interface LmsAPIService { | |||
|      * @param pageSize the page size | ||||
|      * @param sort the sort parameter | ||||
|      * @param filterMap the FilterMap containing all filter criteria | ||||
|      * @return the specified Page of QuizData form all active LMS Setups of the current users institution */ | ||||
|      * @return the specified Page of QuizData from all active LMS Setups of the current users institution */ | ||||
|     Result<Page<QuizData>> requestQuizDataPage( | ||||
|             final int pageNumber, | ||||
|             final int pageSize, | ||||
|  | @ -139,7 +139,7 @@ public interface LmsAPIService { | |||
|      * @param sortAttribute the sort attribute for the new Page | ||||
|      * @param pageNumber the number of the Page to build | ||||
|      * @param pageSize the size of the Page to build | ||||
|      * @return A Page of QuizData extracted form a given list of QuizData */ | ||||
|      * @return A Page of QuizData extracted from a given list of QuizData */ | ||||
|     static Function<List<QuizData>, Page<QuizData>> quizzesToPageFunction( | ||||
|             final String sortAttribute, | ||||
|             final int pageNumber, | ||||
|  |  | |||
|  | @ -12,7 +12,6 @@ import ch.ethz.seb.sebserver.gbl.async.CircuitBreaker; | |||
| import ch.ethz.seb.sebserver.gbl.model.institution.LmsSetup; | ||||
| import ch.ethz.seb.sebserver.gbl.model.institution.LmsSetupTestResult; | ||||
| import ch.ethz.seb.sebserver.webservice.servicelayer.lms.impl.AbstractCachedCourseAccess; | ||||
| import ch.ethz.seb.sebserver.webservice.servicelayer.lms.impl.AbstractCourseAccess; | ||||
| 
 | ||||
| /** Defines an LMS API access template to build SEB Server LMS integration. | ||||
|  * </p> | ||||
|  |  | |||
|  | @ -23,7 +23,7 @@ public interface SEBRestrictionAPI { | |||
|      * @return {@link LmsSetupTestResult } instance with the test result report */ | ||||
|     LmsSetupTestResult testCourseRestrictionAPI(); | ||||
| 
 | ||||
|     /** Get SEB restriction data form LMS within a {@link SEBRestrictionData } instance. The available restriction | ||||
|     /** Get SEB restriction data from LMS within a {@link SEBRestrictionData } instance. The available restriction | ||||
|      * details | ||||
|      * depends on the type of LMS but shall at least contains the config-key(s) and the browser-exam-key(s). | ||||
|      * | ||||
|  |  | |||
|  | @ -1,188 +0,0 @@ | |||
| /* | ||||
|  * Copyright (c) 2020 ETH Zürich, Educational Development and Technology (LET) | ||||
|  * | ||||
|  * This Source Code Form is subject to the terms of the Mozilla Public | ||||
|  * License, v. 2.0. If a copy of the MPL was not distributed with this | ||||
|  * file, You can obtain one at http://mozilla.org/MPL/2.0/. | ||||
|  */ | ||||
| 
 | ||||
| package ch.ethz.seb.sebserver.webservice.servicelayer.lms.impl; | ||||
| 
 | ||||
| import java.util.Collection; | ||||
| import java.util.List; | ||||
| import java.util.Set; | ||||
| import java.util.function.Supplier; | ||||
| 
 | ||||
| import org.slf4j.Logger; | ||||
| import org.slf4j.LoggerFactory; | ||||
| import org.springframework.core.env.Environment; | ||||
| 
 | ||||
| import ch.ethz.seb.sebserver.gbl.Constants; | ||||
| import ch.ethz.seb.sebserver.gbl.async.AsyncService; | ||||
| import ch.ethz.seb.sebserver.gbl.async.CircuitBreaker; | ||||
| import ch.ethz.seb.sebserver.gbl.model.exam.Chapters; | ||||
| import ch.ethz.seb.sebserver.gbl.model.exam.QuizData; | ||||
| import ch.ethz.seb.sebserver.gbl.model.user.ExamineeAccountDetails; | ||||
| import ch.ethz.seb.sebserver.gbl.util.Result; | ||||
| import ch.ethz.seb.sebserver.webservice.servicelayer.dao.FilterMap; | ||||
| 
 | ||||
| /** A partial course access API implementation that uses CircuitBreaker to apply LMS | ||||
|  * API requests in a protected environment. | ||||
|  * | ||||
|  * Extend this to implement a concrete course access API for a given type of LMS. */ | ||||
| public abstract class AbstractCourseAccess { | ||||
| 
 | ||||
|     private static final Logger log = LoggerFactory.getLogger(AbstractCourseAccess.class); | ||||
| 
 | ||||
|     /** CircuitBreaker for protected quiz and course data requests */ | ||||
|     protected final CircuitBreaker<List<QuizData>> allQuizzesRequest; | ||||
|     /** CircuitBreaker for protected quiz and course data requests */ | ||||
|     protected final CircuitBreaker<Collection<QuizData>> quizzesRequest; | ||||
|     /** CircuitBreaker for protected quiz and course data requests */ | ||||
|     protected final CircuitBreaker<QuizData> quizRequest; | ||||
|     /** CircuitBreaker for protected chapter data requests */ | ||||
|     protected final CircuitBreaker<Chapters> chaptersRequest; | ||||
|     /** CircuitBreaker for protected examinee account details requests */ | ||||
|     protected final CircuitBreaker<ExamineeAccountDetails> accountDetailRequest; | ||||
| 
 | ||||
|     protected AbstractCourseAccess( | ||||
|             final AsyncService asyncService, | ||||
|             final Environment environment) { | ||||
| 
 | ||||
|         this.allQuizzesRequest = asyncService.createCircuitBreaker( | ||||
|                 environment.getProperty( | ||||
|                         "sebserver.webservice.circuitbreaker.quizzesRequest.attempts", | ||||
|                         Integer.class, | ||||
|                         3), | ||||
|                 environment.getProperty( | ||||
|                         "sebserver.webservice.circuitbreaker.quizzesRequest.blockingTime", | ||||
|                         Long.class, | ||||
|                         Constants.MINUTE_IN_MILLIS), | ||||
|                 environment.getProperty( | ||||
|                         "sebserver.webservice.circuitbreaker.quizzesRequest.timeToRecover", | ||||
|                         Long.class, | ||||
|                         Constants.MINUTE_IN_MILLIS)); | ||||
| 
 | ||||
|         this.quizzesRequest = asyncService.createCircuitBreaker( | ||||
|                 environment.getProperty( | ||||
|                         "sebserver.webservice.circuitbreaker.quizzesRequest.attempts", | ||||
|                         Integer.class, | ||||
|                         3), | ||||
|                 environment.getProperty( | ||||
|                         "sebserver.webservice.circuitbreaker.quizzesRequest.blockingTime", | ||||
|                         Long.class, | ||||
|                         Constants.SECOND_IN_MILLIS * 10), | ||||
|                 environment.getProperty( | ||||
|                         "sebserver.webservice.circuitbreaker.quizzesRequest.timeToRecover", | ||||
|                         Long.class, | ||||
|                         Constants.MINUTE_IN_MILLIS)); | ||||
| 
 | ||||
|         this.quizRequest = asyncService.createCircuitBreaker( | ||||
|                 environment.getProperty( | ||||
|                         "sebserver.webservice.circuitbreaker.quizzesRequest.attempts", | ||||
|                         Integer.class, | ||||
|                         3), | ||||
|                 environment.getProperty( | ||||
|                         "sebserver.webservice.circuitbreaker.quizzesRequest.blockingTime", | ||||
|                         Long.class, | ||||
|                         Constants.SECOND_IN_MILLIS * 10), | ||||
|                 environment.getProperty( | ||||
|                         "sebserver.webservice.circuitbreaker.quizzesRequest.timeToRecover", | ||||
|                         Long.class, | ||||
|                         Constants.MINUTE_IN_MILLIS)); | ||||
| 
 | ||||
|         this.chaptersRequest = asyncService.createCircuitBreaker( | ||||
|                 environment.getProperty( | ||||
|                         "sebserver.webservice.circuitbreaker.chaptersRequest.attempts", | ||||
|                         Integer.class, | ||||
|                         3), | ||||
|                 environment.getProperty( | ||||
|                         "sebserver.webservice.circuitbreaker.chaptersRequest.blockingTime", | ||||
|                         Long.class, | ||||
|                         Constants.SECOND_IN_MILLIS * 10), | ||||
|                 environment.getProperty( | ||||
|                         "sebserver.webservice.circuitbreaker.chaptersRequest.timeToRecover", | ||||
|                         Long.class, | ||||
|                         Constants.SECOND_IN_MILLIS * 30)); | ||||
| 
 | ||||
|         this.accountDetailRequest = asyncService.createCircuitBreaker( | ||||
|                 environment.getProperty( | ||||
|                         "sebserver.webservice.circuitbreaker.accountDetailRequest.attempts", | ||||
|                         Integer.class, | ||||
|                         2), | ||||
|                 environment.getProperty( | ||||
|                         "sebserver.webservice.circuitbreaker.accountDetailRequest.blockingTime", | ||||
|                         Long.class, | ||||
|                         Constants.SECOND_IN_MILLIS * 10), | ||||
|                 environment.getProperty( | ||||
|                         "sebserver.webservice.circuitbreaker.accountDetailRequest.timeToRecover", | ||||
|                         Long.class, | ||||
|                         Constants.SECOND_IN_MILLIS * 30)); | ||||
|     } | ||||
| 
 | ||||
|     public Result<List<QuizData>> protectedQuizzesRequest(final FilterMap filterMap) { | ||||
|         return this.allQuizzesRequest.protectedRun(allQuizzesSupplier(filterMap)) | ||||
|                 .onError(error -> log.error( | ||||
|                         "Failed to run protectedQuizzesRequest: {}", | ||||
|                         error.getMessage())); | ||||
|     } | ||||
| 
 | ||||
|     public Result<Collection<QuizData>> protectedQuizzesRequest(final Set<String> ids) { | ||||
|         return this.quizzesRequest.protectedRun(quizzesSupplier(ids)) | ||||
|                 .onError(error -> log.error( | ||||
|                         "Failed to run protectedQuizzesRequest: {}", | ||||
|                         error.getMessage())); | ||||
|     } | ||||
| 
 | ||||
|     public Result<QuizData> protectedQuizRequest(final String id) { | ||||
|         return this.quizRequest.protectedRun(quizSupplier(id)) | ||||
|                 .onError(error -> log.error( | ||||
|                         "Failed to run protectedQuizRequest: {}", | ||||
|                         error.getMessage())); | ||||
|     } | ||||
| 
 | ||||
|     public Result<ExamineeAccountDetails> getExamineeAccountDetails(final String examineeSessionId) { | ||||
|         final Supplier<ExamineeAccountDetails> accountDetailsSupplier = accountDetailsSupplier(examineeSessionId); | ||||
|         return this.accountDetailRequest.protectedRun(() -> { | ||||
|             try { | ||||
|                 return accountDetailsSupplier.get(); | ||||
|             } catch (final Exception e) { | ||||
|                 log.error("Unexpected error while trying to get examinee account details: ", e); | ||||
|                 throw e; | ||||
|             } | ||||
|         }); | ||||
|     } | ||||
| 
 | ||||
|     /** Default implementation that uses getExamineeAccountDetails to geht the examinee name | ||||
|      * | ||||
|      * @param examineeSessionId | ||||
|      * @return The examinee account name for the given examineeSessionId */ | ||||
|     public String getExamineeName(final String examineeSessionId) { | ||||
|         return getExamineeAccountDetails(examineeSessionId) | ||||
|                 .map(ExamineeAccountDetails::getDisplayName) | ||||
|                 .onError(error -> log.warn("Failed to request user-name for ID: {}", error.getMessage(), error)) | ||||
|                 .getOr(examineeSessionId); | ||||
|     } | ||||
| 
 | ||||
|     public Result<Chapters> getCourseChapters(final String courseId) { | ||||
|         return this.chaptersRequest.protectedRun(getCourseChaptersSupplier(courseId)) | ||||
|                 .onError(error -> log.error( | ||||
|                         "Failed to run getCourseChapters: {}", | ||||
|                         error.getMessage())); | ||||
|     } | ||||
| 
 | ||||
|     protected abstract Supplier<ExamineeAccountDetails> accountDetailsSupplier(final String examineeSessionId); | ||||
| 
 | ||||
|     /** Provides a supplier to supply request to use within the circuit breaker */ | ||||
|     protected abstract Supplier<List<QuizData>> allQuizzesSupplier(final FilterMap filterMap); | ||||
| 
 | ||||
|     /** Provides a supplier for the quiz data request to use within the circuit breaker */ | ||||
|     protected abstract Supplier<Collection<QuizData>> quizzesSupplier(final Set<String> ids); | ||||
| 
 | ||||
|     /** Provides a supplier for the quiz data request to use within the circuit breaker */ | ||||
|     protected abstract Supplier<QuizData> quizSupplier(final String id); | ||||
| 
 | ||||
|     /** Provides a supplier for the course chapter data request to use within the circuit breaker */ | ||||
|     protected abstract Supplier<Chapters> getCourseChaptersSupplier(final String courseId); | ||||
| 
 | ||||
| } | ||||
|  | @ -151,7 +151,7 @@ public class ExamSessionControlTask implements DisposableBean { | |||
| 
 | ||||
|     private void controlExamLMSUpdate() { | ||||
|         if (log.isTraceEnabled()) { | ||||
|             log.trace("Start update exams form LMS"); | ||||
|             log.trace("Start update exams from LMS"); | ||||
|         } | ||||
| 
 | ||||
|         try { | ||||
|  |  | |||
|  | @ -91,7 +91,7 @@ class ExamUpdateHandler { | |||
|                     .getLmsAPITemplate(lmsSetupId) | ||||
|                     .flatMap(template -> template.getQuizzes(new HashSet<>(exams.keySet()))) | ||||
|                     .onError(error -> log.warn( | ||||
|                             "Failed to get quizzes form LMS Setup: {} cause: {}", | ||||
|                             "Failed to get quizzes from LMS Setup: {} cause: {}", | ||||
|                             lmsSetupId, | ||||
|                             error.getMessage())) | ||||
|                     .getOr(Collections.emptyList()) | ||||
|  |  | |||
		Loading…
	
	Add table
		
		Reference in a new issue
	
	 anhefti
						anhefti