diff --git a/lib/taskana-core-test/src/test/java/acceptance/task/query/TaskQueryImplAccTest.java b/lib/taskana-core-test/src/test/java/acceptance/task/query/TaskQueryImplAccTest.java index f88d431b6..3db978521 100644 --- a/lib/taskana-core-test/src/test/java/acceptance/task/query/TaskQueryImplAccTest.java +++ b/lib/taskana-core-test/src/test/java/acceptance/task/query/TaskQueryImplAccTest.java @@ -7,7 +7,6 @@ import static pro.taskana.testapi.DefaultTestEntities.defaultTestClassification; import static pro.taskana.testapi.DefaultTestEntities.defaultTestObjectReference; import static pro.taskana.testapi.DefaultTestEntities.defaultTestWorkbasket; -import java.security.PrivilegedActionException; import java.time.Instant; import java.util.List; import java.util.Map; @@ -81,15 +80,14 @@ class TaskQueryImplAccTest { .workbasketSummary(wb); } - private WorkbasketSummary createWorkbasketWithPermission() throws PrivilegedActionException { + private WorkbasketSummary createWorkbasketWithPermission() throws Exception { WorkbasketSummary workbasketSummary = defaultTestWorkbasket().buildAndStoreAsSummary(workbasketService, "businessadmin"); persistPermission(workbasketSummary); return workbasketSummary; } - private void persistPermission(WorkbasketSummary workbasketSummary) - throws PrivilegedActionException { + private void persistPermission(WorkbasketSummary workbasketSummary) throws Exception { WorkbasketAccessItemBuilder.newWorkbasketAccessItem() .workbasketId(workbasketSummary.getId()) .accessId(currentUserContext.getUserid()) diff --git a/lib/taskana-test-api/src/main/java/pro/taskana/testapi/DefaultTestEntities.java b/lib/taskana-test-api/src/main/java/pro/taskana/testapi/DefaultTestEntities.java index 743cfe1bd..c56ab32d7 100644 --- a/lib/taskana-test-api/src/main/java/pro/taskana/testapi/DefaultTestEntities.java +++ b/lib/taskana-test-api/src/main/java/pro/taskana/testapi/DefaultTestEntities.java @@ -1,9 +1,16 @@ package pro.taskana.testapi; +import static pro.taskana.testapi.builder.ClassificationBuilder.newClassification; +import static pro.taskana.testapi.builder.ObjectReferenceBuilder.newObjectReference; +import static pro.taskana.testapi.builder.UserBuilder.newUser; +import static pro.taskana.testapi.builder.WorkbasketBuilder.newWorkbasket; + +import java.util.Random; import java.util.UUID; import pro.taskana.testapi.builder.ClassificationBuilder; import pro.taskana.testapi.builder.ObjectReferenceBuilder; +import pro.taskana.testapi.builder.UserBuilder; import pro.taskana.testapi.builder.WorkbasketBuilder; import pro.taskana.workbasket.api.WorkbasketType; @@ -14,13 +21,13 @@ public class DefaultTestEntities { } public static ClassificationBuilder defaultTestClassification() { - return ClassificationBuilder.newClassification() + return newClassification() .key(UUID.randomUUID().toString().replace("-", "")) .domain("DOMAIN_A"); } public static WorkbasketBuilder defaultTestWorkbasket() { - return WorkbasketBuilder.newWorkbasket() + return newWorkbasket() .key(UUID.randomUUID().toString()) .domain("DOMAIN_A") .name("Megabasket") @@ -29,11 +36,32 @@ public class DefaultTestEntities { } public static ObjectReferenceBuilder defaultTestObjectReference() { - return ObjectReferenceBuilder.newObjectReference() + return newObjectReference() .company("Company1") .system("System1") .systemInstance("Instance1") .type("Type1") .value("Value1"); } + + public static UserBuilder randomTestUser() { + return newUser() + .id(UUID.randomUUID().toString().replace("-", "")) + .firstName(RandomStringGenerator.generateRandomString(10)) + .lastName(RandomStringGenerator.generateRandomString(12)); + } + + private static class RandomStringGenerator { + private static final Random RANDOM = new Random(15); + + private static String generateRandomString(int length) { + // see ascii table for details number -> char conversion. + return RANDOM + .ints('0', 'z' + 1) + .filter(i -> (i <= '9' || i >= 'A') && (i <= 'Z' || i >= 'a')) + .limit(length) + .collect(StringBuilder::new, StringBuilder::appendCodePoint, StringBuilder::append) + .toString(); + } + } } diff --git a/lib/taskana-test-api/src/main/java/pro/taskana/testapi/builder/ClassificationBuilder.java b/lib/taskana-test-api/src/main/java/pro/taskana/testapi/builder/ClassificationBuilder.java index b71cb0200..674bbdbfe 100644 --- a/lib/taskana-test-api/src/main/java/pro/taskana/testapi/builder/ClassificationBuilder.java +++ b/lib/taskana-test-api/src/main/java/pro/taskana/testapi/builder/ClassificationBuilder.java @@ -1,9 +1,6 @@ package pro.taskana.testapi.builder; -import java.security.PrivilegedActionException; -import java.security.PrivilegedExceptionAction; import java.time.Instant; -import javax.security.auth.Subject; import pro.taskana.classification.api.ClassificationCustomField; import pro.taskana.classification.api.ClassificationService; @@ -15,9 +12,10 @@ import pro.taskana.classification.api.models.ClassificationSummary; import pro.taskana.common.api.exceptions.DomainNotFoundException; import pro.taskana.common.api.exceptions.InvalidArgumentException; import pro.taskana.common.api.exceptions.NotAuthorizedException; -import pro.taskana.common.api.security.UserPrincipal; +import pro.taskana.testapi.builder.EntityBuilder.SummaryEntityBuilder; -public class ClassificationBuilder { +public class ClassificationBuilder + implements SummaryEntityBuilder { private final ClassificationTestImpl testClassification = new ClassificationTestImpl(); @@ -113,6 +111,12 @@ public class ClassificationBuilder { return this; } + @Override + public ClassificationSummary entityToSummary(Classification classification) { + return classification.asSummary(); + } + + @Override public Classification buildAndStore(ClassificationService classificationService) throws InvalidArgumentException, ClassificationAlreadyExistException, DomainNotFoundException, MalformedServiceLevelException, NotAuthorizedException, ClassificationNotFoundException { @@ -123,25 +127,4 @@ public class ClassificationBuilder { testClassification.setId(null); } } - - public Classification buildAndStore(ClassificationService classificationService, String userId) - throws PrivilegedActionException { - Subject subject = new Subject(); - subject.getPrincipals().add(new UserPrincipal(userId)); - PrivilegedExceptionAction performBuildAndStore = - () -> buildAndStore(classificationService); - - return Subject.doAs(subject, performBuildAndStore); - } - - public ClassificationSummary buildAndStoreAsSummary(ClassificationService classificationService) - throws InvalidArgumentException, ClassificationAlreadyExistException, DomainNotFoundException, - MalformedServiceLevelException, NotAuthorizedException, ClassificationNotFoundException { - return buildAndStore(classificationService).asSummary(); - } - - public ClassificationSummary buildAndStoreAsSummary( - ClassificationService classificationService, String userId) throws PrivilegedActionException { - return buildAndStore(classificationService, userId).asSummary(); - } } diff --git a/lib/taskana-test-api/src/main/java/pro/taskana/testapi/builder/EntityBuilder.java b/lib/taskana-test-api/src/main/java/pro/taskana/testapi/builder/EntityBuilder.java new file mode 100644 index 000000000..88a382ced --- /dev/null +++ b/lib/taskana-test-api/src/main/java/pro/taskana/testapi/builder/EntityBuilder.java @@ -0,0 +1,38 @@ +package pro.taskana.testapi.builder; + +import java.security.PrivilegedActionException; +import java.security.PrivilegedExceptionAction; +import javax.security.auth.Subject; + +import pro.taskana.common.api.security.UserPrincipal; + +public interface EntityBuilder { + + EntityT buildAndStore(ServiceT service) throws Exception; + + default EntityT buildAndStore(ServiceT service, String userId) throws Exception { + return execAsUser(userId, () -> buildAndStore(service)); + } + + private T execAsUser(String userId, PrivilegedExceptionAction runnable) + throws PrivilegedActionException { + Subject subject = new Subject(); + subject.getPrincipals().add(new UserPrincipal(userId)); + + return Subject.doAs(subject, runnable); + } + + interface SummaryEntityBuilder + extends EntityBuilder { + SummaryEntityT entityToSummary(EntityT entity); + + default SummaryEntityT buildAndStoreAsSummary(ServiceT service) throws Exception { + return entityToSummary(buildAndStore(service)); + } + + default SummaryEntityT buildAndStoreAsSummary(ServiceT service, String userId) + throws Exception { + return entityToSummary(buildAndStore(service, userId)); + } + } +} diff --git a/lib/taskana-test-api/src/main/java/pro/taskana/testapi/builder/TaskBuilder.java b/lib/taskana-test-api/src/main/java/pro/taskana/testapi/builder/TaskBuilder.java index 699038da7..90da4abb1 100644 --- a/lib/taskana-test-api/src/main/java/pro/taskana/testapi/builder/TaskBuilder.java +++ b/lib/taskana-test-api/src/main/java/pro/taskana/testapi/builder/TaskBuilder.java @@ -1,17 +1,13 @@ package pro.taskana.testapi.builder; -import java.security.PrivilegedActionException; -import java.security.PrivilegedExceptionAction; import java.time.Instant; import java.util.Arrays; import java.util.Map; -import javax.security.auth.Subject; import pro.taskana.classification.api.exceptions.ClassificationNotFoundException; import pro.taskana.classification.api.models.ClassificationSummary; import pro.taskana.common.api.exceptions.InvalidArgumentException; import pro.taskana.common.api.exceptions.NotAuthorizedException; -import pro.taskana.common.api.security.UserPrincipal; import pro.taskana.task.api.CallbackState; import pro.taskana.task.api.TaskCustomField; import pro.taskana.task.api.TaskCustomIntField; @@ -25,10 +21,11 @@ import pro.taskana.task.api.models.Attachment; import pro.taskana.task.api.models.ObjectReference; import pro.taskana.task.api.models.Task; import pro.taskana.task.api.models.TaskSummary; +import pro.taskana.testapi.builder.EntityBuilder.SummaryEntityBuilder; import pro.taskana.workbasket.api.exceptions.WorkbasketNotFoundException; import pro.taskana.workbasket.api.models.WorkbasketSummary; -public class TaskBuilder { +public class TaskBuilder implements SummaryEntityBuilder { private final TaskTestImpl testTask = new TaskTestImpl(); @@ -210,6 +207,12 @@ public class TaskBuilder { return this; } + @Override + public TaskSummary entityToSummary(Task entity) { + return entity.asSummary(); + } + + @Override public Task buildAndStore(TaskService taskService) throws TaskAlreadyExistException, InvalidArgumentException, WorkbasketNotFoundException, ClassificationNotFoundException, NotAuthorizedException, AttachmentPersistenceException, @@ -222,25 +225,4 @@ public class TaskBuilder { testTask.setExternalId(null); } } - - public Task buildAndStore(TaskService taskService, String userId) - throws PrivilegedActionException { - Subject subject = new Subject(); - subject.getPrincipals().add(new UserPrincipal(userId)); - PrivilegedExceptionAction performBuildAndStore = () -> buildAndStore(taskService); - - return Subject.doAs(subject, performBuildAndStore); - } - - public TaskSummary buildAndStoreAsSummary(TaskService taskService) - throws TaskAlreadyExistException, InvalidArgumentException, TaskNotFoundException, - WorkbasketNotFoundException, ClassificationNotFoundException, NotAuthorizedException, - AttachmentPersistenceException, ObjectReferencePersistenceException { - return buildAndStore(taskService).asSummary(); - } - - public TaskSummary buildAndStoreAsSummary(TaskService taskService, String userId) - throws PrivilegedActionException { - return buildAndStore(taskService, userId).asSummary(); - } } diff --git a/lib/taskana-test-api/src/main/java/pro/taskana/testapi/builder/TaskCommentBuilder.java b/lib/taskana-test-api/src/main/java/pro/taskana/testapi/builder/TaskCommentBuilder.java index 3e828fe50..b0da4815d 100644 --- a/lib/taskana-test-api/src/main/java/pro/taskana/testapi/builder/TaskCommentBuilder.java +++ b/lib/taskana-test-api/src/main/java/pro/taskana/testapi/builder/TaskCommentBuilder.java @@ -1,19 +1,15 @@ package pro.taskana.testapi.builder; -import java.security.PrivilegedActionException; -import java.security.PrivilegedExceptionAction; import java.time.Instant; -import javax.security.auth.Subject; import pro.taskana.common.api.exceptions.InvalidArgumentException; import pro.taskana.common.api.exceptions.NotAuthorizedException; -import pro.taskana.common.api.security.UserPrincipal; import pro.taskana.task.api.TaskService; import pro.taskana.task.api.exceptions.TaskCommentNotFoundException; import pro.taskana.task.api.exceptions.TaskNotFoundException; import pro.taskana.task.api.models.TaskComment; -public class TaskCommentBuilder { +public class TaskCommentBuilder implements EntityBuilder { private final TaskCommentTestImpl testTaskComment = new TaskCommentTestImpl(); @@ -51,6 +47,7 @@ public class TaskCommentBuilder { return this; } + @Override public TaskComment buildAndStore(TaskService taskService) throws InvalidArgumentException, TaskNotFoundException, NotAuthorizedException, TaskCommentNotFoundException { @@ -61,13 +58,4 @@ public class TaskCommentBuilder { testTaskComment.setId(null); } } - - public TaskComment buildAndStore(TaskService taskService, String userId) - throws PrivilegedActionException { - Subject subject = new Subject(); - subject.getPrincipals().add(new UserPrincipal(userId)); - PrivilegedExceptionAction performBuildAndStore = () -> buildAndStore(taskService); - - return Subject.doAs(subject, performBuildAndStore); - } } diff --git a/lib/taskana-test-api/src/main/java/pro/taskana/testapi/builder/WorkbasketAccessItemBuilder.java b/lib/taskana-test-api/src/main/java/pro/taskana/testapi/builder/WorkbasketAccessItemBuilder.java index 6f0aaef34..19f298eac 100644 --- a/lib/taskana-test-api/src/main/java/pro/taskana/testapi/builder/WorkbasketAccessItemBuilder.java +++ b/lib/taskana-test-api/src/main/java/pro/taskana/testapi/builder/WorkbasketAccessItemBuilder.java @@ -1,12 +1,7 @@ package pro.taskana.testapi.builder; -import java.security.PrivilegedActionException; -import java.security.PrivilegedExceptionAction; -import javax.security.auth.Subject; - import pro.taskana.common.api.exceptions.InvalidArgumentException; import pro.taskana.common.api.exceptions.NotAuthorizedException; -import pro.taskana.common.api.security.UserPrincipal; import pro.taskana.workbasket.api.WorkbasketPermission; import pro.taskana.workbasket.api.WorkbasketService; import pro.taskana.workbasket.api.exceptions.WorkbasketAccessItemAlreadyExistException; @@ -14,7 +9,8 @@ import pro.taskana.workbasket.api.exceptions.WorkbasketNotFoundException; import pro.taskana.workbasket.api.models.WorkbasketAccessItem; import pro.taskana.workbasket.internal.models.WorkbasketAccessItemImpl; -public class WorkbasketAccessItemBuilder { +public class WorkbasketAccessItemBuilder + implements EntityBuilder { WorkbasketAccessItemImpl testWorkbasketAccessItem = new WorkbasketAccessItemImpl(); @@ -48,19 +44,10 @@ public class WorkbasketAccessItemBuilder { return this; } + @Override public WorkbasketAccessItem buildAndStore(WorkbasketService workbasketService) throws InvalidArgumentException, WorkbasketAccessItemAlreadyExistException, WorkbasketNotFoundException, NotAuthorizedException { return workbasketService.createWorkbasketAccessItem(testWorkbasketAccessItem); } - - public WorkbasketAccessItem buildAndStore(WorkbasketService workbasketService, String userId) - throws PrivilegedActionException { - Subject subject = new Subject(); - subject.getPrincipals().add(new UserPrincipal(userId)); - PrivilegedExceptionAction performBuildAndStore = - () -> buildAndStore(workbasketService); - - return Subject.doAs(subject, performBuildAndStore); - } } diff --git a/lib/taskana-test-api/src/main/java/pro/taskana/testapi/builder/WorkbasketBuilder.java b/lib/taskana-test-api/src/main/java/pro/taskana/testapi/builder/WorkbasketBuilder.java index ef8e97def..c4df0b76b 100644 --- a/lib/taskana-test-api/src/main/java/pro/taskana/testapi/builder/WorkbasketBuilder.java +++ b/lib/taskana-test-api/src/main/java/pro/taskana/testapi/builder/WorkbasketBuilder.java @@ -1,14 +1,11 @@ package pro.taskana.testapi.builder; -import java.security.PrivilegedActionException; -import java.security.PrivilegedExceptionAction; import java.time.Instant; -import javax.security.auth.Subject; import pro.taskana.common.api.exceptions.DomainNotFoundException; import pro.taskana.common.api.exceptions.InvalidArgumentException; import pro.taskana.common.api.exceptions.NotAuthorizedException; -import pro.taskana.common.api.security.UserPrincipal; +import pro.taskana.testapi.builder.EntityBuilder.SummaryEntityBuilder; import pro.taskana.workbasket.api.WorkbasketCustomField; import pro.taskana.workbasket.api.WorkbasketService; import pro.taskana.workbasket.api.WorkbasketType; @@ -17,7 +14,8 @@ import pro.taskana.workbasket.api.exceptions.WorkbasketNotFoundException; import pro.taskana.workbasket.api.models.Workbasket; import pro.taskana.workbasket.api.models.WorkbasketSummary; -public class WorkbasketBuilder { +public class WorkbasketBuilder + implements SummaryEntityBuilder { private final WorkbasketTestImpl testWorkbasket = new WorkbasketTestImpl(); @@ -108,6 +106,12 @@ public class WorkbasketBuilder { return this; } + @Override + public WorkbasketSummary entityToSummary(Workbasket workbasket) { + return workbasket.asSummary(); + } + + @Override public Workbasket buildAndStore(WorkbasketService workbasketService) throws InvalidArgumentException, WorkbasketAlreadyExistException, DomainNotFoundException, NotAuthorizedException, WorkbasketNotFoundException { @@ -118,25 +122,4 @@ public class WorkbasketBuilder { testWorkbasket.setId(null); } } - - public Workbasket buildAndStore(WorkbasketService workbasketService, String userId) - throws PrivilegedActionException { - Subject subject = new Subject(); - subject.getPrincipals().add(new UserPrincipal(userId)); - PrivilegedExceptionAction performBuildAndStore = - () -> buildAndStore(workbasketService); - - return Subject.doAs(subject, performBuildAndStore); - } - - public WorkbasketSummary buildAndStoreAsSummary(WorkbasketService workbasketService) - throws InvalidArgumentException, WorkbasketAlreadyExistException, WorkbasketNotFoundException, - DomainNotFoundException, NotAuthorizedException { - return buildAndStore(workbasketService).asSummary(); - } - - public WorkbasketSummary buildAndStoreAsSummary( - WorkbasketService workbasketService, String userId) throws PrivilegedActionException { - return buildAndStore(workbasketService, userId).asSummary(); - } }