From 77663f02ca821e1dcd64ba0d996c035fe1f983b8 Mon Sep 17 00:00:00 2001 From: BerndBreier <33351391+BerndBreier@users.noreply.github.com> Date: Fri, 31 Jan 2020 15:41:32 +0100 Subject: [PATCH] TSK-991 -prevent api classes from accessing internal classes -disable architecture test for mapper classes / package -added architecture tests for exceptions and api/internal -defined exceptional classes: TaskanaHistory* and BulkOperationResults --- .../resource/TaskHistoryEventResource.java | 4 +- .../classification/api/Classification.java | 5 +- .../internal/ClassificationServiceImpl.java | 2 +- .../pro/taskana/common/api/JobService.java | 2 - .../{internal/jobs => api}/ScheduledJob.java | 2 +- .../taskana/common/internal/JobMapper.java | 2 +- .../common/internal/JobServiceImpl.java | 2 +- .../internal/jobs/AbstractTaskanaJob.java | 1 + .../jobs/ClassificationChangedJob.java | 1 + .../common/internal/jobs/JobRunner.java | 1 + .../common/internal/jobs/TaskCleanupJob.java | 1 + .../common/internal/jobs/TaskRefreshJob.java | 1 + .../internal/jobs/WorkbasketCleanupJob.java | 1 + .../taskana/report/api/CategoryReport.java | 2 +- .../report/api/ClassificationReport.java | 8 +-- .../report/api/CustomFieldValueReport.java | 2 +- .../taskana/report/api/TaskStatusReport.java | 2 +- .../report/api/TimeIntervalReportBuilder.java | 2 +- .../taskana/report/api/TimestampReport.java | 4 +- .../taskana/report/api/WorkbasketReport.java | 2 +- .../row/DetailedClassificationRow.java | 4 +- .../{internal => api}/row/FoldableRow.java | 8 +-- .../{internal => api}/row/SingleRow.java | 10 +-- .../{internal => api}/row/TimestampRow.java | 4 +- .../structure/ColumnHeader.java | 2 +- .../structure/QueryItem.java | 2 +- .../structure/QueryItemPreprocessor.java | 2 +- .../{internal => api}/structure/Report.java | 4 +- .../{internal => api}/structure/Row.java | 2 +- .../header/TaskStatusColumnHeader.java | 2 +- .../header/TimeIntervalColumnHeader.java | 2 +- .../report/internal/item/AgeQueryItem.java | 2 +- .../report/internal/item/TaskQueryItem.java | 2 +- .../DaysToWorkingDaysPreProcessor.java | 2 +- .../taskana/workbasket/api/Workbasket.java | 5 +- .../UpdateObjectsUseUtcTimeStampsAccTest.java | 2 +- ...deDetailedClassificationReportAccTest.java | 4 +- .../ProvideTaskStatusReportAccTest.java | 2 +- .../report/ProvideTimestampReportAccTest.java | 4 +- .../java/pro/taskana/ArchitectureTest.java | 65 +++++++++++++++++-- .../ClassificationReportBuilderImplTest.java | 2 +- .../taskana/report/internal/ReportTest.java | 6 +- .../taskana/rest/resource/ReportResource.java | 4 +- .../resource/ReportResourceAssembler.java | 12 ++-- 44 files changed, 126 insertions(+), 75 deletions(-) rename lib/taskana-core/src/main/java/pro/taskana/common/{internal/jobs => api}/ScheduledJob.java (98%) rename lib/taskana-core/src/main/java/pro/taskana/report/{internal => api}/row/DetailedClassificationRow.java (90%) rename lib/taskana-core/src/main/java/pro/taskana/report/{internal => api}/row/FoldableRow.java (90%) rename lib/taskana-core/src/main/java/pro/taskana/report/{internal => api}/row/SingleRow.java (76%) rename lib/taskana-core/src/main/java/pro/taskana/report/{internal => api}/row/TimestampRow.java (96%) rename lib/taskana-core/src/main/java/pro/taskana/report/{internal => api}/structure/ColumnHeader.java (93%) rename lib/taskana-core/src/main/java/pro/taskana/report/{internal => api}/structure/QueryItem.java (90%) rename lib/taskana-core/src/main/java/pro/taskana/report/{internal => api}/structure/QueryItemPreprocessor.java (89%) rename lib/taskana-core/src/main/java/pro/taskana/report/{internal => api}/structure/Report.java (97%) rename lib/taskana-core/src/main/java/pro/taskana/report/{internal => api}/structure/Row.java (94%) diff --git a/history/taskana-simplehistory-rest-spring/src/main/java/pro/taskana/rest/resource/TaskHistoryEventResource.java b/history/taskana-simplehistory-rest-spring/src/main/java/pro/taskana/rest/resource/TaskHistoryEventResource.java index 1566dc7e3..3c55be394 100644 --- a/history/taskana-simplehistory-rest-spring/src/main/java/pro/taskana/rest/resource/TaskHistoryEventResource.java +++ b/history/taskana-simplehistory-rest-spring/src/main/java/pro/taskana/rest/resource/TaskHistoryEventResource.java @@ -3,7 +3,9 @@ package pro.taskana.rest.resource; import javax.validation.constraints.NotNull; import org.springframework.hateoas.ResourceSupport; -/** Resource class for {@link pro.taskana.history.api.TaskanaHistoryEvent}. */ +import pro.taskana.history.api.TaskanaHistoryEvent; + +/** Resource class for {@link TaskanaHistoryEvent}. */ public class TaskHistoryEventResource extends ResourceSupport { @NotNull private String taskHistoryEventId; diff --git a/lib/taskana-core/src/main/java/pro/taskana/classification/api/Classification.java b/lib/taskana-core/src/main/java/pro/taskana/classification/api/Classification.java index ea13818ec..fedce07af 100644 --- a/lib/taskana-core/src/main/java/pro/taskana/classification/api/Classification.java +++ b/lib/taskana-core/src/main/java/pro/taskana/classification/api/Classification.java @@ -1,12 +1,9 @@ package pro.taskana.classification.api; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import java.time.Instant; -import pro.taskana.classification.internal.ClassificationImpl; - /** Interface used to specify the Classification-Model. */ -@JsonDeserialize(as = ClassificationImpl.class) +// @JsonDeserialize(as = ClassificationImpl.class) public interface Classification extends ClassificationSummary { /** diff --git a/lib/taskana-core/src/main/java/pro/taskana/classification/internal/ClassificationServiceImpl.java b/lib/taskana-core/src/main/java/pro/taskana/classification/internal/ClassificationServiceImpl.java index 4183df9f6..4c771aff0 100644 --- a/lib/taskana-core/src/main/java/pro/taskana/classification/internal/ClassificationServiceImpl.java +++ b/lib/taskana-core/src/main/java/pro/taskana/classification/internal/ClassificationServiceImpl.java @@ -20,13 +20,13 @@ import pro.taskana.classification.api.ClassificationSummary; import pro.taskana.classification.api.exceptions.ClassificationAlreadyExistException; import pro.taskana.classification.api.exceptions.ClassificationInUseException; import pro.taskana.classification.api.exceptions.ClassificationNotFoundException; +import pro.taskana.common.api.ScheduledJob; import pro.taskana.common.api.exceptions.ConcurrencyException; 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.internal.InternalTaskanaEngine; import pro.taskana.common.internal.jobs.ClassificationChangedJob; -import pro.taskana.common.internal.jobs.ScheduledJob; import pro.taskana.common.internal.util.IdGenerator; import pro.taskana.task.api.TaskSummary; import pro.taskana.task.api.TaskanaRole; diff --git a/lib/taskana-core/src/main/java/pro/taskana/common/api/JobService.java b/lib/taskana-core/src/main/java/pro/taskana/common/api/JobService.java index 29126939f..4b2e4d4de 100644 --- a/lib/taskana-core/src/main/java/pro/taskana/common/api/JobService.java +++ b/lib/taskana-core/src/main/java/pro/taskana/common/api/JobService.java @@ -1,7 +1,5 @@ package pro.taskana.common.api; -import pro.taskana.common.internal.jobs.ScheduledJob; - /** Service to manage the TASKANA jobs. */ public interface JobService { diff --git a/lib/taskana-core/src/main/java/pro/taskana/common/internal/jobs/ScheduledJob.java b/lib/taskana-core/src/main/java/pro/taskana/common/api/ScheduledJob.java similarity index 98% rename from lib/taskana-core/src/main/java/pro/taskana/common/internal/jobs/ScheduledJob.java rename to lib/taskana-core/src/main/java/pro/taskana/common/api/ScheduledJob.java index 807b31d64..563299d5c 100644 --- a/lib/taskana-core/src/main/java/pro/taskana/common/internal/jobs/ScheduledJob.java +++ b/lib/taskana-core/src/main/java/pro/taskana/common/api/ScheduledJob.java @@ -1,4 +1,4 @@ -package pro.taskana.common.internal.jobs; +package pro.taskana.common.api; import java.time.Instant; import java.util.Map; diff --git a/lib/taskana-core/src/main/java/pro/taskana/common/internal/JobMapper.java b/lib/taskana-core/src/main/java/pro/taskana/common/internal/JobMapper.java index 325cbeda0..fea3f977f 100644 --- a/lib/taskana-core/src/main/java/pro/taskana/common/internal/JobMapper.java +++ b/lib/taskana-core/src/main/java/pro/taskana/common/internal/JobMapper.java @@ -10,7 +10,7 @@ import org.apache.ibatis.annotations.Results; import org.apache.ibatis.annotations.Select; import org.apache.ibatis.annotations.Update; -import pro.taskana.common.internal.jobs.ScheduledJob; +import pro.taskana.common.api.ScheduledJob; import pro.taskana.common.internal.persistence.MapTypeHandler; /** This class is the mybatis mapping of the JOB table. */ diff --git a/lib/taskana-core/src/main/java/pro/taskana/common/internal/JobServiceImpl.java b/lib/taskana-core/src/main/java/pro/taskana/common/internal/JobServiceImpl.java index 2c8e83135..389119cee 100644 --- a/lib/taskana-core/src/main/java/pro/taskana/common/internal/JobServiceImpl.java +++ b/lib/taskana-core/src/main/java/pro/taskana/common/internal/JobServiceImpl.java @@ -6,7 +6,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import pro.taskana.common.api.JobService; -import pro.taskana.common.internal.jobs.ScheduledJob; +import pro.taskana.common.api.ScheduledJob; /** Controls all job activities. */ public class JobServiceImpl implements JobService { diff --git a/lib/taskana-core/src/main/java/pro/taskana/common/internal/jobs/AbstractTaskanaJob.java b/lib/taskana-core/src/main/java/pro/taskana/common/internal/jobs/AbstractTaskanaJob.java index 95af8119e..805241501 100644 --- a/lib/taskana-core/src/main/java/pro/taskana/common/internal/jobs/AbstractTaskanaJob.java +++ b/lib/taskana-core/src/main/java/pro/taskana/common/internal/jobs/AbstractTaskanaJob.java @@ -4,6 +4,7 @@ import java.util.ArrayList; import java.util.Collection; import java.util.List; +import pro.taskana.common.api.ScheduledJob; import pro.taskana.common.api.TaskanaEngine; import pro.taskana.common.api.exceptions.TaskanaException; import pro.taskana.common.internal.TaskanaEngineImpl; diff --git a/lib/taskana-core/src/main/java/pro/taskana/common/internal/jobs/ClassificationChangedJob.java b/lib/taskana-core/src/main/java/pro/taskana/common/internal/jobs/ClassificationChangedJob.java index f69b4ec4a..9c19e6f87 100644 --- a/lib/taskana-core/src/main/java/pro/taskana/common/internal/jobs/ClassificationChangedJob.java +++ b/lib/taskana-core/src/main/java/pro/taskana/common/internal/jobs/ClassificationChangedJob.java @@ -7,6 +7,7 @@ import java.util.Set; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import pro.taskana.common.api.ScheduledJob; import pro.taskana.common.api.TaskanaEngine; import pro.taskana.common.api.exceptions.TaskanaException; import pro.taskana.common.internal.transaction.TaskanaTransactionProvider; diff --git a/lib/taskana-core/src/main/java/pro/taskana/common/internal/jobs/JobRunner.java b/lib/taskana-core/src/main/java/pro/taskana/common/internal/jobs/JobRunner.java index 79b633e6e..2309da7cc 100644 --- a/lib/taskana-core/src/main/java/pro/taskana/common/internal/jobs/JobRunner.java +++ b/lib/taskana-core/src/main/java/pro/taskana/common/internal/jobs/JobRunner.java @@ -7,6 +7,7 @@ import java.util.List; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import pro.taskana.common.api.ScheduledJob; import pro.taskana.common.api.TaskanaEngine; import pro.taskana.common.api.exceptions.SystemException; import pro.taskana.common.internal.JobServiceImpl; diff --git a/lib/taskana-core/src/main/java/pro/taskana/common/internal/jobs/TaskCleanupJob.java b/lib/taskana-core/src/main/java/pro/taskana/common/internal/jobs/TaskCleanupJob.java index a9f4ff015..56514a9ad 100644 --- a/lib/taskana-core/src/main/java/pro/taskana/common/internal/jobs/TaskCleanupJob.java +++ b/lib/taskana-core/src/main/java/pro/taskana/common/internal/jobs/TaskCleanupJob.java @@ -12,6 +12,7 @@ import org.slf4j.LoggerFactory; import pro.taskana.common.api.BaseQuery; import pro.taskana.common.api.BulkOperationResults; +import pro.taskana.common.api.ScheduledJob; import pro.taskana.common.api.TaskanaEngine; import pro.taskana.common.api.TimeInterval; import pro.taskana.common.api.exceptions.InvalidArgumentException; diff --git a/lib/taskana-core/src/main/java/pro/taskana/common/internal/jobs/TaskRefreshJob.java b/lib/taskana-core/src/main/java/pro/taskana/common/internal/jobs/TaskRefreshJob.java index 5c9bfb484..e1d7a4631 100644 --- a/lib/taskana-core/src/main/java/pro/taskana/common/internal/jobs/TaskRefreshJob.java +++ b/lib/taskana-core/src/main/java/pro/taskana/common/internal/jobs/TaskRefreshJob.java @@ -6,6 +6,7 @@ import java.util.Map; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import pro.taskana.common.api.ScheduledJob; import pro.taskana.common.api.TaskanaEngine; import pro.taskana.common.api.exceptions.TaskanaException; import pro.taskana.common.internal.transaction.TaskanaTransactionProvider; diff --git a/lib/taskana-core/src/main/java/pro/taskana/common/internal/jobs/WorkbasketCleanupJob.java b/lib/taskana-core/src/main/java/pro/taskana/common/internal/jobs/WorkbasketCleanupJob.java index 1e8080465..06c67fc23 100644 --- a/lib/taskana-core/src/main/java/pro/taskana/common/internal/jobs/WorkbasketCleanupJob.java +++ b/lib/taskana-core/src/main/java/pro/taskana/common/internal/jobs/WorkbasketCleanupJob.java @@ -8,6 +8,7 @@ import org.slf4j.LoggerFactory; import pro.taskana.common.api.BaseQuery; import pro.taskana.common.api.BulkOperationResults; +import pro.taskana.common.api.ScheduledJob; import pro.taskana.common.api.TaskanaEngine; import pro.taskana.common.api.exceptions.InvalidArgumentException; import pro.taskana.common.api.exceptions.NotAuthorizedException; diff --git a/lib/taskana-core/src/main/java/pro/taskana/report/api/CategoryReport.java b/lib/taskana-core/src/main/java/pro/taskana/report/api/CategoryReport.java index 77d4640e0..87d41a13b 100644 --- a/lib/taskana-core/src/main/java/pro/taskana/report/api/CategoryReport.java +++ b/lib/taskana-core/src/main/java/pro/taskana/report/api/CategoryReport.java @@ -4,9 +4,9 @@ import java.util.List; import pro.taskana.common.api.exceptions.InvalidArgumentException; import pro.taskana.common.api.exceptions.NotAuthorizedException; +import pro.taskana.report.api.structure.Report; import pro.taskana.report.internal.header.TimeIntervalColumnHeader; import pro.taskana.report.internal.item.MonitorQueryItem; -import pro.taskana.report.internal.structure.Report; /** * A CategoryReport contains the total numbers of tasks of the respective category as well as the diff --git a/lib/taskana-core/src/main/java/pro/taskana/report/api/ClassificationReport.java b/lib/taskana-core/src/main/java/pro/taskana/report/api/ClassificationReport.java index 46e046ec5..9b324d47e 100644 --- a/lib/taskana-core/src/main/java/pro/taskana/report/api/ClassificationReport.java +++ b/lib/taskana-core/src/main/java/pro/taskana/report/api/ClassificationReport.java @@ -4,13 +4,13 @@ import java.util.List; import pro.taskana.common.api.exceptions.InvalidArgumentException; import pro.taskana.common.api.exceptions.NotAuthorizedException; +import pro.taskana.report.api.row.DetailedClassificationRow; +import pro.taskana.report.api.row.FoldableRow; +import pro.taskana.report.api.structure.Report; +import pro.taskana.report.api.structure.Row; import pro.taskana.report.internal.header.TimeIntervalColumnHeader; import pro.taskana.report.internal.item.DetailedMonitorQueryItem; import pro.taskana.report.internal.item.MonitorQueryItem; -import pro.taskana.report.internal.row.DetailedClassificationRow; -import pro.taskana.report.internal.row.FoldableRow; -import pro.taskana.report.internal.structure.Report; -import pro.taskana.report.internal.structure.Row; /** * The ClassificationReport extends the Report. The {@link Row}s of the ClassificationReport are diff --git a/lib/taskana-core/src/main/java/pro/taskana/report/api/CustomFieldValueReport.java b/lib/taskana-core/src/main/java/pro/taskana/report/api/CustomFieldValueReport.java index e3762307c..e10084d99 100644 --- a/lib/taskana-core/src/main/java/pro/taskana/report/api/CustomFieldValueReport.java +++ b/lib/taskana-core/src/main/java/pro/taskana/report/api/CustomFieldValueReport.java @@ -4,9 +4,9 @@ import java.util.List; import pro.taskana.common.api.exceptions.InvalidArgumentException; import pro.taskana.common.api.exceptions.NotAuthorizedException; +import pro.taskana.report.api.structure.Report; import pro.taskana.report.internal.header.TimeIntervalColumnHeader; import pro.taskana.report.internal.item.MonitorQueryItem; -import pro.taskana.report.internal.structure.Report; /** * A CustomFieldValueReport contains the total numbers of tasks of the respective custom field as diff --git a/lib/taskana-core/src/main/java/pro/taskana/report/api/TaskStatusReport.java b/lib/taskana-core/src/main/java/pro/taskana/report/api/TaskStatusReport.java index eabd4321c..a9f311957 100644 --- a/lib/taskana-core/src/main/java/pro/taskana/report/api/TaskStatusReport.java +++ b/lib/taskana-core/src/main/java/pro/taskana/report/api/TaskStatusReport.java @@ -6,9 +6,9 @@ import java.util.stream.Stream; import pro.taskana.common.api.exceptions.InvalidArgumentException; import pro.taskana.common.api.exceptions.NotAuthorizedException; +import pro.taskana.report.api.structure.Report; import pro.taskana.report.internal.header.TaskStatusColumnHeader; import pro.taskana.report.internal.item.TaskQueryItem; -import pro.taskana.report.internal.structure.Report; import pro.taskana.task.api.TaskState; /** diff --git a/lib/taskana-core/src/main/java/pro/taskana/report/api/TimeIntervalReportBuilder.java b/lib/taskana-core/src/main/java/pro/taskana/report/api/TimeIntervalReportBuilder.java index 71836db13..de5bafa67 100644 --- a/lib/taskana-core/src/main/java/pro/taskana/report/api/TimeIntervalReportBuilder.java +++ b/lib/taskana-core/src/main/java/pro/taskana/report/api/TimeIntervalReportBuilder.java @@ -5,10 +5,10 @@ import java.util.Map; import pro.taskana.common.api.exceptions.InvalidArgumentException; import pro.taskana.common.api.exceptions.NotAuthorizedException; +import pro.taskana.report.api.structure.Report; import pro.taskana.report.internal.SelectedItem; import pro.taskana.report.internal.header.TimeIntervalColumnHeader; import pro.taskana.report.internal.item.AgeQueryItem; -import pro.taskana.report.internal.structure.Report; import pro.taskana.task.api.CustomField; import pro.taskana.task.api.TaskState; diff --git a/lib/taskana-core/src/main/java/pro/taskana/report/api/TimestampReport.java b/lib/taskana-core/src/main/java/pro/taskana/report/api/TimestampReport.java index c781d1034..dd2ddd52c 100644 --- a/lib/taskana-core/src/main/java/pro/taskana/report/api/TimestampReport.java +++ b/lib/taskana-core/src/main/java/pro/taskana/report/api/TimestampReport.java @@ -4,10 +4,10 @@ import java.util.List; import pro.taskana.common.api.exceptions.InvalidArgumentException; import pro.taskana.common.api.exceptions.NotAuthorizedException; +import pro.taskana.report.api.row.TimestampRow; +import pro.taskana.report.api.structure.Report; import pro.taskana.report.internal.header.TimeIntervalColumnHeader; import pro.taskana.report.internal.item.TimestampQueryItem; -import pro.taskana.report.internal.row.TimestampRow; -import pro.taskana.report.internal.structure.Report; /** A {@link TimestampReport} displays created and competed tasks for a specific dates. */ public class TimestampReport extends Report { diff --git a/lib/taskana-core/src/main/java/pro/taskana/report/api/WorkbasketReport.java b/lib/taskana-core/src/main/java/pro/taskana/report/api/WorkbasketReport.java index 5d521f9b3..e7e646e56 100644 --- a/lib/taskana-core/src/main/java/pro/taskana/report/api/WorkbasketReport.java +++ b/lib/taskana-core/src/main/java/pro/taskana/report/api/WorkbasketReport.java @@ -4,10 +4,10 @@ import java.util.List; import pro.taskana.common.api.exceptions.InvalidArgumentException; import pro.taskana.common.api.exceptions.NotAuthorizedException; +import pro.taskana.report.api.structure.Report; import pro.taskana.report.internal.CombinedClassificationFilter; import pro.taskana.report.internal.header.TimeIntervalColumnHeader; import pro.taskana.report.internal.item.MonitorQueryItem; -import pro.taskana.report.internal.structure.Report; /** * A WorkbasketReport contains the total numbers of tasks of the respective workbasket as well as diff --git a/lib/taskana-core/src/main/java/pro/taskana/report/internal/row/DetailedClassificationRow.java b/lib/taskana-core/src/main/java/pro/taskana/report/api/row/DetailedClassificationRow.java similarity index 90% rename from lib/taskana-core/src/main/java/pro/taskana/report/internal/row/DetailedClassificationRow.java rename to lib/taskana-core/src/main/java/pro/taskana/report/api/row/DetailedClassificationRow.java index d94629ab8..2b2da042a 100644 --- a/lib/taskana-core/src/main/java/pro/taskana/report/internal/row/DetailedClassificationRow.java +++ b/lib/taskana-core/src/main/java/pro/taskana/report/api/row/DetailedClassificationRow.java @@ -1,8 +1,8 @@ -package pro.taskana.report.internal.row; +package pro.taskana.report.api.row; import pro.taskana.report.api.ClassificationReport; +import pro.taskana.report.api.structure.Row; import pro.taskana.report.internal.item.DetailedMonitorQueryItem; -import pro.taskana.report.internal.structure.Row; /** * Represents a single Row inside {@link ClassificationReport.DetailedClassificationReport}. The diff --git a/lib/taskana-core/src/main/java/pro/taskana/report/internal/row/FoldableRow.java b/lib/taskana-core/src/main/java/pro/taskana/report/api/row/FoldableRow.java similarity index 90% rename from lib/taskana-core/src/main/java/pro/taskana/report/internal/row/FoldableRow.java rename to lib/taskana-core/src/main/java/pro/taskana/report/api/row/FoldableRow.java index 898921e8a..a5d24514d 100644 --- a/lib/taskana-core/src/main/java/pro/taskana/report/internal/row/FoldableRow.java +++ b/lib/taskana-core/src/main/java/pro/taskana/report/api/row/FoldableRow.java @@ -1,4 +1,4 @@ -package pro.taskana.report.internal.row; +package pro.taskana.report.api.row; import java.util.LinkedHashMap; import java.util.Map; @@ -6,9 +6,9 @@ import java.util.Set; import java.util.function.Function; import pro.taskana.common.internal.util.LoggerUtils; -import pro.taskana.report.internal.structure.QueryItem; -import pro.taskana.report.internal.structure.Report; -import pro.taskana.report.internal.structure.Row; +import pro.taskana.report.api.structure.QueryItem; +import pro.taskana.report.api.structure.Report; +import pro.taskana.report.api.structure.Row; /** * The FoldableRow extends the {@link SingleRow}. In contrast to the {@link SingleRow} the diff --git a/lib/taskana-core/src/main/java/pro/taskana/report/internal/row/SingleRow.java b/lib/taskana-core/src/main/java/pro/taskana/report/api/row/SingleRow.java similarity index 76% rename from lib/taskana-core/src/main/java/pro/taskana/report/internal/row/SingleRow.java rename to lib/taskana-core/src/main/java/pro/taskana/report/api/row/SingleRow.java index 2c3ce34cf..81a46f7a8 100644 --- a/lib/taskana-core/src/main/java/pro/taskana/report/internal/row/SingleRow.java +++ b/lib/taskana-core/src/main/java/pro/taskana/report/api/row/SingleRow.java @@ -1,9 +1,9 @@ -package pro.taskana.report.internal.row; +package pro.taskana.report.api.row; -import pro.taskana.report.internal.structure.ColumnHeader; -import pro.taskana.report.internal.structure.QueryItem; -import pro.taskana.report.internal.structure.Report; -import pro.taskana.report.internal.structure.Row; +import pro.taskana.report.api.structure.ColumnHeader; +import pro.taskana.report.api.structure.QueryItem; +import pro.taskana.report.api.structure.Report; +import pro.taskana.report.api.structure.Row; /** * A SingleRow represents a single row in a {@link Report}. It contains an array of cells whose diff --git a/lib/taskana-core/src/main/java/pro/taskana/report/internal/row/TimestampRow.java b/lib/taskana-core/src/main/java/pro/taskana/report/api/row/TimestampRow.java similarity index 96% rename from lib/taskana-core/src/main/java/pro/taskana/report/internal/row/TimestampRow.java rename to lib/taskana-core/src/main/java/pro/taskana/report/api/row/TimestampRow.java index 325c20d3d..8aa10aaf1 100644 --- a/lib/taskana-core/src/main/java/pro/taskana/report/internal/row/TimestampRow.java +++ b/lib/taskana-core/src/main/java/pro/taskana/report/api/row/TimestampRow.java @@ -1,8 +1,8 @@ -package pro.taskana.report.internal.row; +package pro.taskana.report.api.row; import pro.taskana.report.api.TimestampReport; +import pro.taskana.report.api.structure.Row; import pro.taskana.report.internal.item.TimestampQueryItem; -import pro.taskana.report.internal.structure.Row; /** * A single Row inside the {@link TimestampReport}. It contains 4 sub-rows for each org level diff --git a/lib/taskana-core/src/main/java/pro/taskana/report/internal/structure/ColumnHeader.java b/lib/taskana-core/src/main/java/pro/taskana/report/api/structure/ColumnHeader.java similarity index 93% rename from lib/taskana-core/src/main/java/pro/taskana/report/internal/structure/ColumnHeader.java rename to lib/taskana-core/src/main/java/pro/taskana/report/api/structure/ColumnHeader.java index 4cf8699c5..f693dd646 100644 --- a/lib/taskana-core/src/main/java/pro/taskana/report/internal/structure/ColumnHeader.java +++ b/lib/taskana-core/src/main/java/pro/taskana/report/api/structure/ColumnHeader.java @@ -1,4 +1,4 @@ -package pro.taskana.report.internal.structure; +package pro.taskana.report.api.structure; /** * A ColumnHeader is an element of a {@link Report}. It determines weather a given <Item> diff --git a/lib/taskana-core/src/main/java/pro/taskana/report/internal/structure/QueryItem.java b/lib/taskana-core/src/main/java/pro/taskana/report/api/structure/QueryItem.java similarity index 90% rename from lib/taskana-core/src/main/java/pro/taskana/report/internal/structure/QueryItem.java rename to lib/taskana-core/src/main/java/pro/taskana/report/api/structure/QueryItem.java index 2d1168b2a..1f82d1464 100644 --- a/lib/taskana-core/src/main/java/pro/taskana/report/internal/structure/QueryItem.java +++ b/lib/taskana-core/src/main/java/pro/taskana/report/api/structure/QueryItem.java @@ -1,4 +1,4 @@ -package pro.taskana.report.internal.structure; +package pro.taskana.report.api.structure; /** * A QueryItem is en entity on which a {@link Report} is based on. Its value will be added to the diff --git a/lib/taskana-core/src/main/java/pro/taskana/report/internal/structure/QueryItemPreprocessor.java b/lib/taskana-core/src/main/java/pro/taskana/report/api/structure/QueryItemPreprocessor.java similarity index 89% rename from lib/taskana-core/src/main/java/pro/taskana/report/internal/structure/QueryItemPreprocessor.java rename to lib/taskana-core/src/main/java/pro/taskana/report/api/structure/QueryItemPreprocessor.java index 12f9bb62b..b02019678 100644 --- a/lib/taskana-core/src/main/java/pro/taskana/report/internal/structure/QueryItemPreprocessor.java +++ b/lib/taskana-core/src/main/java/pro/taskana/report/api/structure/QueryItemPreprocessor.java @@ -1,4 +1,4 @@ -package pro.taskana.report.internal.structure; +package pro.taskana.report.api.structure; /** * The QueryItemPreprocessor is used when adding {@link QueryItem}s into a {@link Report}. It diff --git a/lib/taskana-core/src/main/java/pro/taskana/report/internal/structure/Report.java b/lib/taskana-core/src/main/java/pro/taskana/report/api/structure/Report.java similarity index 97% rename from lib/taskana-core/src/main/java/pro/taskana/report/internal/structure/Report.java rename to lib/taskana-core/src/main/java/pro/taskana/report/api/structure/Report.java index 92c242da7..583bac6da 100644 --- a/lib/taskana-core/src/main/java/pro/taskana/report/internal/structure/Report.java +++ b/lib/taskana-core/src/main/java/pro/taskana/report/api/structure/Report.java @@ -1,4 +1,4 @@ -package pro.taskana.report.internal.structure; +package pro.taskana.report.api.structure; import java.util.ArrayList; import java.util.LinkedHashMap; @@ -8,7 +8,7 @@ import java.util.Set; import pro.taskana.common.api.exceptions.InvalidArgumentException; import pro.taskana.common.api.exceptions.NotAuthorizedException; -import pro.taskana.report.internal.row.SingleRow; +import pro.taskana.report.api.row.SingleRow; /** * A Report represents an abstract table that consists of {@link Row}s and a list of diff --git a/lib/taskana-core/src/main/java/pro/taskana/report/internal/structure/Row.java b/lib/taskana-core/src/main/java/pro/taskana/report/api/structure/Row.java similarity index 94% rename from lib/taskana-core/src/main/java/pro/taskana/report/internal/structure/Row.java rename to lib/taskana-core/src/main/java/pro/taskana/report/api/structure/Row.java index b2615adcb..d65c3b6ae 100644 --- a/lib/taskana-core/src/main/java/pro/taskana/report/internal/structure/Row.java +++ b/lib/taskana-core/src/main/java/pro/taskana/report/api/structure/Row.java @@ -1,4 +1,4 @@ -package pro.taskana.report.internal.structure; +package pro.taskana.report.api.structure; /** * Representation of a row in a {@link Report}. It contains an array of cells whose index diff --git a/lib/taskana-core/src/main/java/pro/taskana/report/internal/header/TaskStatusColumnHeader.java b/lib/taskana-core/src/main/java/pro/taskana/report/internal/header/TaskStatusColumnHeader.java index 12ce11e91..927db8f83 100644 --- a/lib/taskana-core/src/main/java/pro/taskana/report/internal/header/TaskStatusColumnHeader.java +++ b/lib/taskana-core/src/main/java/pro/taskana/report/internal/header/TaskStatusColumnHeader.java @@ -1,7 +1,7 @@ package pro.taskana.report.internal.header; +import pro.taskana.report.api.structure.ColumnHeader; import pro.taskana.report.internal.item.TaskQueryItem; -import pro.taskana.report.internal.structure.ColumnHeader; import pro.taskana.task.api.TaskState; /** The TaskStatusColumnHeader represents a column for each {@link TaskState}. */ diff --git a/lib/taskana-core/src/main/java/pro/taskana/report/internal/header/TimeIntervalColumnHeader.java b/lib/taskana-core/src/main/java/pro/taskana/report/internal/header/TimeIntervalColumnHeader.java index 60d18634a..24fb55704 100644 --- a/lib/taskana-core/src/main/java/pro/taskana/report/internal/header/TimeIntervalColumnHeader.java +++ b/lib/taskana-core/src/main/java/pro/taskana/report/internal/header/TimeIntervalColumnHeader.java @@ -5,8 +5,8 @@ import java.time.format.DateTimeFormatter; import java.util.List; import java.util.Locale; +import pro.taskana.report.api.structure.ColumnHeader; import pro.taskana.report.internal.item.AgeQueryItem; -import pro.taskana.report.internal.structure.ColumnHeader; /** * A TimeIntervalColumnHeader has a lower and an upper age limit which subdivide the count of tasks diff --git a/lib/taskana-core/src/main/java/pro/taskana/report/internal/item/AgeQueryItem.java b/lib/taskana-core/src/main/java/pro/taskana/report/internal/item/AgeQueryItem.java index a8923397d..b31c1ac76 100644 --- a/lib/taskana-core/src/main/java/pro/taskana/report/internal/item/AgeQueryItem.java +++ b/lib/taskana-core/src/main/java/pro/taskana/report/internal/item/AgeQueryItem.java @@ -1,6 +1,6 @@ package pro.taskana.report.internal.item; -import pro.taskana.report.internal.structure.QueryItem; +import pro.taskana.report.api.structure.QueryItem; /** * The MonitorQueryItem entity contains the number of tasks for a key (e.g. workbasketKey) and age diff --git a/lib/taskana-core/src/main/java/pro/taskana/report/internal/item/TaskQueryItem.java b/lib/taskana-core/src/main/java/pro/taskana/report/internal/item/TaskQueryItem.java index 4280efbca..6ad4d655a 100644 --- a/lib/taskana-core/src/main/java/pro/taskana/report/internal/item/TaskQueryItem.java +++ b/lib/taskana-core/src/main/java/pro/taskana/report/internal/item/TaskQueryItem.java @@ -1,6 +1,6 @@ package pro.taskana.report.internal.item; -import pro.taskana.report.internal.structure.QueryItem; +import pro.taskana.report.api.structure.QueryItem; import pro.taskana.task.api.TaskState; /** diff --git a/lib/taskana-core/src/main/java/pro/taskana/report/internal/preprocessor/DaysToWorkingDaysPreProcessor.java b/lib/taskana-core/src/main/java/pro/taskana/report/internal/preprocessor/DaysToWorkingDaysPreProcessor.java index dd8f00a06..e1027fbef 100644 --- a/lib/taskana-core/src/main/java/pro/taskana/report/internal/preprocessor/DaysToWorkingDaysPreProcessor.java +++ b/lib/taskana-core/src/main/java/pro/taskana/report/internal/preprocessor/DaysToWorkingDaysPreProcessor.java @@ -3,10 +3,10 @@ package pro.taskana.report.internal.preprocessor; import java.util.List; import pro.taskana.common.api.exceptions.InvalidArgumentException; +import pro.taskana.report.api.structure.QueryItemPreprocessor; import pro.taskana.report.internal.DaysToWorkingDaysConverter; import pro.taskana.report.internal.header.TimeIntervalColumnHeader; import pro.taskana.report.internal.item.AgeQueryItem; -import pro.taskana.report.internal.structure.QueryItemPreprocessor; /** * Uses {@link DaysToWorkingDaysConverter} to convert an <I>s age to working days. diff --git a/lib/taskana-core/src/main/java/pro/taskana/workbasket/api/Workbasket.java b/lib/taskana-core/src/main/java/pro/taskana/workbasket/api/Workbasket.java index 596420693..643e6fbfa 100644 --- a/lib/taskana-core/src/main/java/pro/taskana/workbasket/api/Workbasket.java +++ b/lib/taskana-core/src/main/java/pro/taskana/workbasket/api/Workbasket.java @@ -1,12 +1,9 @@ package pro.taskana.workbasket.api; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import java.time.Instant; -import pro.taskana.workbasket.internal.WorkbasketImpl; - /** Workbasket entity interface. */ -@JsonDeserialize(as = WorkbasketImpl.class) +// @JsonDeserialize(as = WorkbasketImpl.class) public interface Workbasket { /** diff --git a/lib/taskana-core/src/test/java/acceptance/persistence/UpdateObjectsUseUtcTimeStampsAccTest.java b/lib/taskana-core/src/test/java/acceptance/persistence/UpdateObjectsUseUtcTimeStampsAccTest.java index 255d61b82..6759c08e5 100644 --- a/lib/taskana-core/src/test/java/acceptance/persistence/UpdateObjectsUseUtcTimeStampsAccTest.java +++ b/lib/taskana-core/src/test/java/acceptance/persistence/UpdateObjectsUseUtcTimeStampsAccTest.java @@ -19,13 +19,13 @@ import pro.taskana.classification.api.ClassificationService; import pro.taskana.classification.api.exceptions.ClassificationAlreadyExistException; import pro.taskana.classification.api.exceptions.ClassificationNotFoundException; import pro.taskana.common.api.JobService; +import pro.taskana.common.api.ScheduledJob; import pro.taskana.common.api.exceptions.AttachmentPersistenceException; import pro.taskana.common.api.exceptions.ConcurrencyException; 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.internal.JobServiceImpl; -import pro.taskana.common.internal.jobs.ScheduledJob; import pro.taskana.security.JaasExtension; import pro.taskana.security.WithAccessId; import pro.taskana.task.api.Task; diff --git a/lib/taskana-core/src/test/java/acceptance/report/ProvideDetailedClassificationReportAccTest.java b/lib/taskana-core/src/test/java/acceptance/report/ProvideDetailedClassificationReportAccTest.java index 13f4c5d4b..83b10105a 100644 --- a/lib/taskana-core/src/test/java/acceptance/report/ProvideDetailedClassificationReportAccTest.java +++ b/lib/taskana-core/src/test/java/acceptance/report/ProvideDetailedClassificationReportAccTest.java @@ -20,10 +20,10 @@ import pro.taskana.common.api.exceptions.InvalidArgumentException; import pro.taskana.common.api.exceptions.NotAuthorizedException; import pro.taskana.report.api.ClassificationReport.DetailedClassificationReport; import pro.taskana.report.api.TaskMonitorService; +import pro.taskana.report.api.row.FoldableRow; +import pro.taskana.report.api.structure.Row; import pro.taskana.report.internal.header.TimeIntervalColumnHeader; import pro.taskana.report.internal.item.DetailedMonitorQueryItem; -import pro.taskana.report.internal.row.FoldableRow; -import pro.taskana.report.internal.structure.Row; import pro.taskana.security.JaasExtension; import pro.taskana.security.WithAccessId; import pro.taskana.task.api.CustomField; diff --git a/lib/taskana-core/src/test/java/acceptance/report/ProvideTaskStatusReportAccTest.java b/lib/taskana-core/src/test/java/acceptance/report/ProvideTaskStatusReportAccTest.java index 4fd7fac05..6475cedff 100644 --- a/lib/taskana-core/src/test/java/acceptance/report/ProvideTaskStatusReportAccTest.java +++ b/lib/taskana-core/src/test/java/acceptance/report/ProvideTaskStatusReportAccTest.java @@ -17,9 +17,9 @@ import pro.taskana.common.api.exceptions.InvalidArgumentException; import pro.taskana.common.api.exceptions.NotAuthorizedException; import pro.taskana.report.api.TaskMonitorService; import pro.taskana.report.api.TaskStatusReport; +import pro.taskana.report.api.structure.Row; import pro.taskana.report.internal.header.TaskStatusColumnHeader; import pro.taskana.report.internal.item.TaskQueryItem; -import pro.taskana.report.internal.structure.Row; import pro.taskana.security.JaasExtension; import pro.taskana.security.WithAccessId; import pro.taskana.task.api.TaskState; diff --git a/lib/taskana-core/src/test/java/acceptance/report/ProvideTimestampReportAccTest.java b/lib/taskana-core/src/test/java/acceptance/report/ProvideTimestampReportAccTest.java index 81b5a4437..a9310fec5 100644 --- a/lib/taskana-core/src/test/java/acceptance/report/ProvideTimestampReportAccTest.java +++ b/lib/taskana-core/src/test/java/acceptance/report/ProvideTimestampReportAccTest.java @@ -14,10 +14,10 @@ import org.junit.jupiter.api.extension.ExtendWith; import pro.taskana.report.api.TaskMonitorService; import pro.taskana.report.api.TimestampReport; +import pro.taskana.report.api.row.SingleRow; +import pro.taskana.report.api.row.TimestampRow; import pro.taskana.report.internal.header.TimeIntervalColumnHeader; import pro.taskana.report.internal.item.TimestampQueryItem; -import pro.taskana.report.internal.row.SingleRow; -import pro.taskana.report.internal.row.TimestampRow; import pro.taskana.security.JaasExtension; import pro.taskana.security.WithAccessId; diff --git a/lib/taskana-core/src/test/java/pro/taskana/ArchitectureTest.java b/lib/taskana-core/src/test/java/pro/taskana/ArchitectureTest.java index a82e06990..aa71121c8 100644 --- a/lib/taskana-core/src/test/java/pro/taskana/ArchitectureTest.java +++ b/lib/taskana-core/src/test/java/pro/taskana/ArchitectureTest.java @@ -5,10 +5,12 @@ import static com.tngtech.archunit.library.GeneralCodingRules.NO_CLASSES_SHOULD_ import static com.tngtech.archunit.library.GeneralCodingRules.NO_CLASSES_SHOULD_THROW_GENERIC_EXCEPTIONS; import static com.tngtech.archunit.library.dependencies.SlicesRuleDefinition.slices; +import com.tngtech.archunit.base.DescribedPredicate; +import com.tngtech.archunit.core.domain.JavaClass; import com.tngtech.archunit.core.domain.JavaClasses; import com.tngtech.archunit.core.importer.ClassFileImporter; import com.tngtech.archunit.lang.ArchRule; -import jdk.nashorn.internal.ir.annotations.Ignore; +import java.util.Arrays; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; @@ -17,17 +19,34 @@ import org.junit.jupiter.api.Test; * Test architecture of classes in taskana. For more info and examples see * https://www.archunit.org/userguide/html/000_Index.html */ +@SuppressWarnings({"checkstyle:EmptyLineSeparator"}) class ArchitectureTest { - private static JavaClasses importedClasses; + DescribedPredicate doNotContain(String... namesToBeExcluded) { + return new DescribedPredicate("should not be checked") { + @Override + public boolean apply(JavaClass input) { + String matchingClassName = + Arrays.asList(namesToBeExcluded).stream() + .filter(name -> input.getName().contains(name)) + .findFirst() + .orElse(null); + + return (matchingClassName == null); + + }; + }; + } + @BeforeAll - static void init() { + static void init() throws ClassNotFoundException { // time intensive operation should only be done once importedClasses = new ClassFileImporter().importPackages("pro.taskana"); } - @Ignore + @Test + @Disabled void mapperShouldBePlacedInMappingsPackage() { ArchRule myRule = classes() @@ -39,10 +58,36 @@ class ArchitectureTest { myRule.check(importedClasses); } + @Test + void apiClassesShouldNotDependOnInternalClasses() { + ArchRule myRule = + classes() + .that() + .resideInAPackage("..api") + .should() + .onlyDependOnClassesThat() + .resideOutsideOfPackage("..internal.."); + myRule.check(importedClasses.that(doNotContain("TaskanaHistory", + "BulkOperationResults"))); + } + + @Test + void exceptionsShouldBePlacedInExceptionPackage() { + ArchRule myRule = + classes() + .that() + .haveSimpleNameEndingWith("Exception") + .should() + .resideInAPackage("..exceptions.."); + + myRule.check(importedClasses); + } + @Test void onlyExceptionsShouldResideInExceptionPackage() { ArchRule myRule = - classes().that().resideInAPackage("..exceptions").should().beAssignableTo(Throwable.class); + classes().that().resideInAPackage("..exceptions").should() + .beAssignableTo(Throwable.class); myRule.check(importedClasses); } @@ -59,14 +104,20 @@ class ArchitectureTest { @Test @Disabled void freeOfCycles() { - ArchRule myRule = slices().matching("pro.taskana.(*)..").should().beFreeOfCycles(); + ArchRule myRule = slices().matching("pro.taskana.(*)..") + .should().beFreeOfCycles(); myRule.check(importedClasses); } @Test @Disabled void freeOfCyclicDependencies() { - ArchRule myRule = slices().matching("pro.taskana.(*)..").should().notDependOnEachOther(); + ArchRule myRule = slices().matching("pro.taskana.(*)..").should() + .notDependOnEachOther(); myRule.check(importedClasses); } + + private boolean containsName(JavaClass input, String name) { + return !input.getName().contains(name); + } } diff --git a/lib/taskana-core/src/test/java/pro/taskana/report/internal/ClassificationReportBuilderImplTest.java b/lib/taskana-core/src/test/java/pro/taskana/report/internal/ClassificationReportBuilderImplTest.java index 4cff85778..f6f7ca88f 100644 --- a/lib/taskana-core/src/test/java/pro/taskana/report/internal/ClassificationReportBuilderImplTest.java +++ b/lib/taskana-core/src/test/java/pro/taskana/report/internal/ClassificationReportBuilderImplTest.java @@ -29,10 +29,10 @@ import pro.taskana.common.api.exceptions.NotAuthorizedException; import pro.taskana.common.internal.InternalTaskanaEngine; import pro.taskana.report.api.ClassificationReport; import pro.taskana.report.api.ClassificationReport.DetailedClassificationReport; +import pro.taskana.report.api.row.FoldableRow; import pro.taskana.report.internal.header.TimeIntervalColumnHeader; import pro.taskana.report.internal.item.DetailedMonitorQueryItem; import pro.taskana.report.internal.item.MonitorQueryItem; -import pro.taskana.report.internal.row.FoldableRow; import pro.taskana.task.api.CustomField; import pro.taskana.task.api.TaskState; diff --git a/lib/taskana-core/src/test/java/pro/taskana/report/internal/ReportTest.java b/lib/taskana-core/src/test/java/pro/taskana/report/internal/ReportTest.java index 2474bde4e..7259a3416 100644 --- a/lib/taskana-core/src/test/java/pro/taskana/report/internal/ReportTest.java +++ b/lib/taskana-core/src/test/java/pro/taskana/report/internal/ReportTest.java @@ -12,11 +12,11 @@ import java.util.stream.IntStream; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import pro.taskana.report.api.structure.QueryItemPreprocessor; +import pro.taskana.report.api.structure.Report; +import pro.taskana.report.api.structure.Row; import pro.taskana.report.internal.header.TimeIntervalColumnHeader; import pro.taskana.report.internal.item.MonitorQueryItem; -import pro.taskana.report.internal.structure.QueryItemPreprocessor; -import pro.taskana.report.internal.structure.Report; -import pro.taskana.report.internal.structure.Row; /** Tests for {@link Report}. */ class ReportTest { diff --git a/rest/taskana-rest-spring/src/main/java/pro/taskana/rest/resource/ReportResource.java b/rest/taskana-rest-spring/src/main/java/pro/taskana/rest/resource/ReportResource.java index 95cf3388a..2a41b42e3 100644 --- a/rest/taskana-rest-spring/src/main/java/pro/taskana/rest/resource/ReportResource.java +++ b/rest/taskana-rest-spring/src/main/java/pro/taskana/rest/resource/ReportResource.java @@ -4,8 +4,8 @@ import java.util.Arrays; import java.util.List; import org.springframework.hateoas.ResourceSupport; -import pro.taskana.report.internal.row.SingleRow; -import pro.taskana.report.internal.structure.Report; +import pro.taskana.report.api.row.SingleRow; +import pro.taskana.report.api.structure.Report; /** Resource class for {@link Report}. */ public class ReportResource extends ResourceSupport { diff --git a/rest/taskana-rest-spring/src/main/java/pro/taskana/rest/resource/ReportResourceAssembler.java b/rest/taskana-rest-spring/src/main/java/pro/taskana/rest/resource/ReportResourceAssembler.java index 4b89e9b33..251e78985 100644 --- a/rest/taskana-rest-spring/src/main/java/pro/taskana/rest/resource/ReportResourceAssembler.java +++ b/rest/taskana-rest-spring/src/main/java/pro/taskana/rest/resource/ReportResourceAssembler.java @@ -18,12 +18,12 @@ import pro.taskana.report.api.ClassificationReport; import pro.taskana.report.api.TaskStatusReport; import pro.taskana.report.api.TimestampReport; import pro.taskana.report.api.WorkbasketReport; -import pro.taskana.report.internal.row.FoldableRow; -import pro.taskana.report.internal.row.SingleRow; -import pro.taskana.report.internal.structure.ColumnHeader; -import pro.taskana.report.internal.structure.QueryItem; -import pro.taskana.report.internal.structure.Report; -import pro.taskana.report.internal.structure.Row; +import pro.taskana.report.api.row.FoldableRow; +import pro.taskana.report.api.row.SingleRow; +import pro.taskana.report.api.structure.ColumnHeader; +import pro.taskana.report.api.structure.QueryItem; +import pro.taskana.report.api.structure.Report; +import pro.taskana.report.api.structure.Row; import pro.taskana.rest.MonitorController; import pro.taskana.task.api.TaskState;