diff --git a/src/main/java/cz/muni/ics/kypo/training/adaptive/annotations/security/IsAdmin.java b/src/main/java/cz/muni/ics/kypo/training/adaptive/annotations/security/IsAdmin.java new file mode 100644 index 0000000000000000000000000000000000000000..8641807428d2afa20165fe2a2a0cec55fb6988d6 --- /dev/null +++ b/src/main/java/cz/muni/ics/kypo/training/adaptive/annotations/security/IsAdmin.java @@ -0,0 +1,16 @@ +package cz.muni.ics.kypo.training.adaptive.annotations.security; + +import org.springframework.security.access.prepost.PreAuthorize; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * The custom annotation <i>@IsAdmin<i/>. All methods annotated with this annotation expect the user has a role <strong>ROLE_TRAINING_ADMINISTRATOR<strong/>. + */ +@Target(ElementType.METHOD) +@Retention(RetentionPolicy.RUNTIME) +@PreAuthorize("hasAuthority(T(cz.muni.ics.kypo.training.adaptive.enums.RoleTypeSecurity).ROLE_TRAINING_ADMINISTRATOR)") +public @interface IsAdmin {} diff --git a/src/main/java/cz/muni/ics/kypo/training/adaptive/annotations/security/IsDesignerOrAdmin.java b/src/main/java/cz/muni/ics/kypo/training/adaptive/annotations/security/IsDesignerOrAdmin.java new file mode 100644 index 0000000000000000000000000000000000000000..1977ac8877e86e1ad2d7abff21f1d88c4d69981b --- /dev/null +++ b/src/main/java/cz/muni/ics/kypo/training/adaptive/annotations/security/IsDesignerOrAdmin.java @@ -0,0 +1,18 @@ +package cz.muni.ics.kypo.training.adaptive.annotations.security; + +import org.springframework.security.access.prepost.PreAuthorize; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * The custom annotation <i>@IsDesignerOrAdmin<i/>. All methods annotated with this annotation expect the user has a role <strong>ROLE_TRAINING_ADMINISTRATOR<strong/> + * or <strong>ROLE_TRAINING_DESIGNER<strong/>. + */ +@Target(ElementType.METHOD) +@Retention(RetentionPolicy.RUNTIME) +@PreAuthorize("hasAnyAuthority(T(cz.muni.ics.kypo.training.adaptive.enums.RoleTypeSecurity).ROLE_TRAINING_ADMINISTRATOR, " + + "T(cz.muni.ics.kypo.training.adaptive.enums.RoleTypeSecurity).ROLE_TRAINING_DESIGNER)") +public @interface IsDesignerOrAdmin {} diff --git a/src/main/java/cz/muni/ics/kypo/training/adaptive/annotations/security/IsDesignerOrOrganizerOrAdmin.java b/src/main/java/cz/muni/ics/kypo/training/adaptive/annotations/security/IsDesignerOrOrganizerOrAdmin.java new file mode 100644 index 0000000000000000000000000000000000000000..03509ebb2c0f57a0c4e5b272aec341082fb8de61 --- /dev/null +++ b/src/main/java/cz/muni/ics/kypo/training/adaptive/annotations/security/IsDesignerOrOrganizerOrAdmin.java @@ -0,0 +1,20 @@ +package cz.muni.ics.kypo.training.adaptive.annotations.security; + + +import org.springframework.security.access.prepost.PreAuthorize; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * The custom annotation <i>@IsDesignerOrOrganizerOrAdmin<i/>. All methods annotated with this annotation expect the user has a role <strong>ROLE_TRAINING_ADMINISTRATOR<strong/> + * or <strong>ROLE_TRAINING_ORGANIZER<strong/> or <strong>ROLE_TRAINING_DESIGNER<strong/>. + */ +@Target(ElementType.METHOD) +@Retention(RetentionPolicy.RUNTIME) +@PreAuthorize("hasAnyAuthority(T(cz.muni.ics.kypo.training.adaptive.enums.RoleTypeSecurity).ROLE_TRAINING_ADMINISTRATOR, " + + "T(cz.muni.ics.kypo.training.adaptive.enums.RoleTypeSecurity).ROLE_TRAINING_DESIGNER, " + + "T(cz.muni.ics.kypo.training.adaptive.enums.RoleTypeSecurity).ROLE_TRAINING_ORGANIZER)") +public @interface IsDesignerOrOrganizerOrAdmin {} diff --git a/src/main/java/cz/muni/ics/kypo/training/adaptive/annotations/security/IsOrganizerOrAdmin.java b/src/main/java/cz/muni/ics/kypo/training/adaptive/annotations/security/IsOrganizerOrAdmin.java new file mode 100644 index 0000000000000000000000000000000000000000..ef89254f64d1fb6e0fc7190960499b9cbe144bce --- /dev/null +++ b/src/main/java/cz/muni/ics/kypo/training/adaptive/annotations/security/IsOrganizerOrAdmin.java @@ -0,0 +1,19 @@ +package cz.muni.ics.kypo.training.adaptive.annotations.security; + + +import org.springframework.security.access.prepost.PreAuthorize; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * The custom annotation <i>@IsOrganizerOrAdmin<i/>. All methods annotated with this annotation expect the user has a role <strong>ROLE_TRAINING_ADMINISTRATOR<strong/> + * or <strong>ROLE_TRAINING_ORGANIZER<strong/>. + */ +@Target(ElementType.METHOD) +@Retention(RetentionPolicy.RUNTIME) +@PreAuthorize("hasAnyAuthority(T(cz.muni.ics.kypo.training.adaptive.enums.RoleTypeSecurity).ROLE_TRAINING_ADMINISTRATOR, " + + "T(cz.muni.ics.kypo.training.adaptive.enums.RoleTypeSecurity).ROLE_TRAINING_ORGANIZER)") +public @interface IsOrganizerOrAdmin {} diff --git a/src/main/java/cz/muni/ics/kypo/training/adaptive/annotations/security/IsTrainee.java b/src/main/java/cz/muni/ics/kypo/training/adaptive/annotations/security/IsTrainee.java new file mode 100644 index 0000000000000000000000000000000000000000..5a66026a80f5ef7f38491104d6c31569742f3263 --- /dev/null +++ b/src/main/java/cz/muni/ics/kypo/training/adaptive/annotations/security/IsTrainee.java @@ -0,0 +1,16 @@ +package cz.muni.ics.kypo.training.adaptive.annotations.security; + +import org.springframework.security.access.prepost.PreAuthorize; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * The custom annotation <i>@IsTrainee<i/>. All methods annotated with this annotation expect the user has a role <strong>ROLE_TRAINING_TRAINEE<strong/>. + */ +@Target(ElementType.METHOD) +@Retention(RetentionPolicy.RUNTIME) +@PreAuthorize("hasAuthority(T(cz.muni.ics.kypo.training.adaptive.enums.RoleTypeSecurity).ROLE_TRAINING_TRAINEE)") +public @interface IsTrainee {} diff --git a/src/main/java/cz/muni/ics/kypo/training/adaptive/annotations/security/IsTraineeOrAdmin.java b/src/main/java/cz/muni/ics/kypo/training/adaptive/annotations/security/IsTraineeOrAdmin.java new file mode 100644 index 0000000000000000000000000000000000000000..84d3604f1726bf1f7f8ec213f09b89e8635b7faa --- /dev/null +++ b/src/main/java/cz/muni/ics/kypo/training/adaptive/annotations/security/IsTraineeOrAdmin.java @@ -0,0 +1,18 @@ +package cz.muni.ics.kypo.training.adaptive.annotations.security; + +import org.springframework.security.access.prepost.PreAuthorize; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * The custom annotation <i>@IsTraineeOrAdmin<i/>. All methods annotated with this annotation expect the user has a role <strong>ROLE_TRAINING_ADMINISTRATOR<strong/> + * or <strong>ROLE_TRAINING_TRAINEE<strong/>. + */ +@Target(ElementType.METHOD) +@Retention(RetentionPolicy.RUNTIME) +@PreAuthorize("hasAnyAuthority(T(cz.muni.ics.kypo.training.adaptive.enums.RoleTypeSecurity).ROLE_TRAINING_TRAINEE, " + + "T(cz.muni.ics.kypo.training.adaptive.enums.RoleTypeSecurity).ROLE_TRAINING_ADMINISTRATOR)") +public @interface IsTraineeOrAdmin {} diff --git a/src/main/java/cz/muni/ics/kypo/training/adaptive/annotations/transactions/TransactionalRO.java b/src/main/java/cz/muni/ics/kypo/training/adaptive/annotations/transactions/TransactionalRO.java new file mode 100644 index 0000000000000000000000000000000000000000..acae74f7c607102dd8fc1a153f838c4956931284 --- /dev/null +++ b/src/main/java/cz/muni/ics/kypo/training/adaptive/annotations/transactions/TransactionalRO.java @@ -0,0 +1,57 @@ +package cz.muni.ics.kypo.training.adaptive.annotations.transactions; + +import org.springframework.core.annotation.AliasFor; +import org.springframework.transaction.annotation.Isolation; +import org.springframework.transaction.annotation.Propagation; +import org.springframework.transaction.annotation.Transactional; + +import java.lang.annotation.*; + +/** + * Extending of the class {@link Transactional} which has <i>read-only</i> set to true. + * + */ +@Transactional(rollbackFor = Exception.class, readOnly = true) +@Target({ElementType.METHOD, ElementType.TYPE}) +@Retention(RetentionPolicy.RUNTIME) +@Inherited +@Documented +public @interface TransactionalRO { + + /** + * Value string. + * + * @return the string + */ + @AliasFor("transactionManager") + String value() default ""; + + /** + * Transaction manager string. + * + * @return the string + */ + @AliasFor("value") + String transactionManager() default ""; + + /** + * Propagation propagation. + * + * @return the propagation + */ + Propagation propagation() default Propagation.REQUIRED; + + /** + * Isolation isolation. + * + * @return the isolation + */ + Isolation isolation() default Isolation.DEFAULT; + + /** + * Timeout int. + * + * @return the int + */ + int timeout() default -1; +} diff --git a/src/main/java/cz/muni/ics/kypo/training/adaptive/annotations/transactions/TransactionalWO.java b/src/main/java/cz/muni/ics/kypo/training/adaptive/annotations/transactions/TransactionalWO.java new file mode 100644 index 0000000000000000000000000000000000000000..12995ce98e6c4a8a6f59aa0b3bd25fa7ecee88f6 --- /dev/null +++ b/src/main/java/cz/muni/ics/kypo/training/adaptive/annotations/transactions/TransactionalWO.java @@ -0,0 +1,57 @@ +package cz.muni.ics.kypo.training.adaptive.annotations.transactions; + +import org.springframework.core.annotation.AliasFor; +import org.springframework.transaction.annotation.Isolation; +import org.springframework.transaction.annotation.Propagation; +import org.springframework.transaction.annotation.Transactional; + +import java.lang.annotation.*; + +/** + * Extending of the class {@link Transactional} which has <i>read-only</i> set to false. + * + */ +@Transactional(rollbackFor = Exception.class) +@Target({ElementType.METHOD, ElementType.TYPE}) +@Retention(RetentionPolicy.RUNTIME) +@Inherited +@Documented +public @interface TransactionalWO { + + /** + * Value string. + * + * @return the string + */ + @AliasFor("transactionManager") + String value() default ""; + + /** + * Transaction manager string. + * + * @return the string + */ + @AliasFor("value") + String transactionManager() default ""; + + /** + * Propagation propagation. + * + * @return the propagation + */ + Propagation propagation() default Propagation.REQUIRED; + + /** + * Isolation isolation. + * + * @return the isolation + */ + Isolation isolation() default Isolation.DEFAULT; + + /** + * Timeout int. + * + * @return the int + */ + int timeout() default -1; +} diff --git a/src/main/java/cz/muni/ics/kypo/training/adaptive/config/ValidationMessagesConfig.java b/src/main/java/cz/muni/ics/kypo/training/adaptive/config/ValidationMessagesConfig.java new file mode 100644 index 0000000000000000000000000000000000000000..fa9d1f0f5f0e358709e51ab4224010fc92a4bde1 --- /dev/null +++ b/src/main/java/cz/muni/ics/kypo/training/adaptive/config/ValidationMessagesConfig.java @@ -0,0 +1,66 @@ +package cz.muni.ics.kypo.training.adaptive.config; + +import org.springframework.context.MessageSource; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Primary; +import org.springframework.context.support.ReloadableResourceBundleMessageSource; +import org.springframework.validation.beanvalidation.LocalValidatorFactoryBean; + +import java.util.Arrays; +import java.util.Comparator; +import java.util.Locale; + +/** + * The type Validation messages config. + */ +@Configuration +public class ValidationMessagesConfig { + + /** + * Message source validation message source. + * + * @return the message source + */ + @Bean + public MessageSource messageSourceValidation() { + final ReloadableResourceBundleMessageSource source = new ReloadableResourceBundleMessageSource(); + source.setBasename("classpath:locale/ValidationMessages"); + source.setUseCodeAsDefaultMessage(true); + source.setDefaultEncoding("UTF-8"); + source.setCacheSeconds(0); + return source; + } + + /** + * Gets validator. + * + * @return the validator + */ + @Bean + @Primary + public LocalValidatorFactoryBean getValidator() { + LocalValidatorFactoryBean bean = new LocalValidatorFactoryBean(); + bean.setValidationMessageSource(messageSourceValidation()); + return bean; + } + + /** + * Prints available locales. It is useful to set up appropriate ValidationMessages.properties file name, + * e.g. messages_en_US.properties + * <p> + * en_US + * <p> + * en -> language; US -> country + * + * @param args the input arguments + */ + public static void main(String[] args) { + Locale[] locales = Locale.getAvailableLocales(); + Arrays.sort(locales, Comparator.comparing(Locale::toString)); + for (Locale l : locales) { + System.out.println(l.toString()); + } + } + +} diff --git a/src/main/java/cz/muni/ics/kypo/training/adaptive/enums/RoleTypeSecurity.java b/src/main/java/cz/muni/ics/kypo/training/adaptive/enums/RoleTypeSecurity.java new file mode 100644 index 0000000000000000000000000000000000000000..c7718a8cf54f70535469d6a655dbe808aa50f34d --- /dev/null +++ b/src/main/java/cz/muni/ics/kypo/training/adaptive/enums/RoleTypeSecurity.java @@ -0,0 +1,24 @@ +package cz.muni.ics.kypo.training.adaptive.enums; + +/** + * The enumeration of Role types used for security. + * + */ +public enum RoleTypeSecurity { + /** + * Role of training administrator. + */ + ROLE_TRAINING_ADMINISTRATOR, + /** + * Role of training designer permits user to work with training definitions. + */ + ROLE_TRAINING_DESIGNER, + /** + * Role of training organizer permits user to work with training instances. + */ + ROLE_TRAINING_ORGANIZER, + /** + * Role of training trainee permits user to work with training runs. + */ + ROLE_TRAINING_TRAINEE +}