TSK-1964: refactored builders to reduce code duplication

This commit is contained in:
Mustapha Zorgati 2022-10-11 09:18:27 +02:00
parent 3c71c08684
commit 2dbdd874d5
8 changed files with 102 additions and 115 deletions

View File

@ -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())

View File

@ -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();
}
}
}

View File

@ -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<ClassificationSummary, Classification, ClassificationService> {
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<Classification> 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();
}
}

View File

@ -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, ServiceT> {
EntityT buildAndStore(ServiceT service) throws Exception;
default EntityT buildAndStore(ServiceT service, String userId) throws Exception {
return execAsUser(userId, () -> buildAndStore(service));
}
private <T> T execAsUser(String userId, PrivilegedExceptionAction<T> runnable)
throws PrivilegedActionException {
Subject subject = new Subject();
subject.getPrincipals().add(new UserPrincipal(userId));
return Subject.doAs(subject, runnable);
}
interface SummaryEntityBuilder<SummaryEntityT, EntityT extends SummaryEntityT, ServiceT>
extends EntityBuilder<EntityT, ServiceT> {
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));
}
}
}

View File

@ -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<TaskSummary, Task, TaskService> {
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<Task> 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();
}
}

View File

@ -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<TaskComment, TaskService> {
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<TaskComment> performBuildAndStore = () -> buildAndStore(taskService);
return Subject.doAs(subject, performBuildAndStore);
}
}

View File

@ -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<WorkbasketAccessItem, WorkbasketService> {
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<WorkbasketAccessItem> performBuildAndStore =
() -> buildAndStore(workbasketService);
return Subject.doAs(subject, performBuildAndStore);
}
}

View File

@ -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<WorkbasketSummary, Workbasket, WorkbasketService> {
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<Workbasket> 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();
}
}