TSK-685 renaming and refactoring of components for better understanding
This commit is contained in:
parent
9830268ecd
commit
c1f743fd6c
|
|
@ -3,7 +3,7 @@ package pro.taskana;
|
||||||
import pro.taskana.report.CategoryReport;
|
import pro.taskana.report.CategoryReport;
|
||||||
import pro.taskana.report.ClassificationReport;
|
import pro.taskana.report.ClassificationReport;
|
||||||
import pro.taskana.report.CustomFieldValueReport;
|
import pro.taskana.report.CustomFieldValueReport;
|
||||||
import pro.taskana.report.DailyEntryExitReport;
|
import pro.taskana.report.TimestampReport;
|
||||||
import pro.taskana.report.TaskStatusReport;
|
import pro.taskana.report.TaskStatusReport;
|
||||||
import pro.taskana.report.WorkbasketReport;
|
import pro.taskana.report.WorkbasketReport;
|
||||||
|
|
||||||
|
|
@ -55,10 +55,10 @@ public interface TaskMonitorService {
|
||||||
TaskStatusReport.Builder createTaskStatusReportBuilder();
|
TaskStatusReport.Builder createTaskStatusReportBuilder();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Provides a {@link DailyEntryExitReport.Builder} for creating a {@link DailyEntryExitReport}.
|
* Provides a {@link TimestampReport.Builder} for creating a {@link TimestampReport}.
|
||||||
*
|
*
|
||||||
* @return a {@link DailyEntryExitReport.Builder}
|
* @return a {@link TimestampReport.Builder}
|
||||||
*/
|
*/
|
||||||
DailyEntryExitReport.Builder createDailyEntryExitReportBuilder();
|
TimestampReport.Builder createTimestampReportBuilder();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,8 +0,0 @@
|
||||||
package pro.taskana;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* This enum contains all statuses of a {@link pro.taskana.Task}.
|
|
||||||
*/
|
|
||||||
public enum TaskStatus {
|
|
||||||
CREATED, CLAIMED, COMPLETED, MODIFIED, PLANNED, DUE
|
|
||||||
}
|
|
||||||
|
|
@ -6,7 +6,7 @@ import pro.taskana.mappings.TaskMonitorMapper;
|
||||||
import pro.taskana.report.CategoryReport;
|
import pro.taskana.report.CategoryReport;
|
||||||
import pro.taskana.report.ClassificationReport;
|
import pro.taskana.report.ClassificationReport;
|
||||||
import pro.taskana.report.CustomFieldValueReport;
|
import pro.taskana.report.CustomFieldValueReport;
|
||||||
import pro.taskana.report.DailyEntryExitReport;
|
import pro.taskana.report.TimestampReport;
|
||||||
import pro.taskana.report.TaskStatusReport;
|
import pro.taskana.report.TaskStatusReport;
|
||||||
import pro.taskana.report.WorkbasketReport;
|
import pro.taskana.report.WorkbasketReport;
|
||||||
|
|
||||||
|
|
@ -50,8 +50,8 @@ public class TaskMonitorServiceImpl implements TaskMonitorService {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public DailyEntryExitReport.Builder createDailyEntryExitReportBuilder() {
|
public TimestampReport.Builder createTimestampReportBuilder() {
|
||||||
return new DailyEntryExitReportBuilderImpl(taskanaEngineImpl, taskMonitorMapper);
|
return new TimestampReportBuilderImpl(taskanaEngineImpl, taskMonitorMapper);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -16,7 +16,7 @@ import pro.taskana.TaskanaRole;
|
||||||
import pro.taskana.exceptions.InvalidArgumentException;
|
import pro.taskana.exceptions.InvalidArgumentException;
|
||||||
import pro.taskana.exceptions.NotAuthorizedException;
|
import pro.taskana.exceptions.NotAuthorizedException;
|
||||||
import pro.taskana.impl.report.header.TimeIntervalColumnHeader;
|
import pro.taskana.impl.report.header.TimeIntervalColumnHeader;
|
||||||
import pro.taskana.impl.report.item.DateQueryItem;
|
import pro.taskana.impl.report.item.AgeQueryItem;
|
||||||
import pro.taskana.impl.util.LoggerUtils;
|
import pro.taskana.impl.util.LoggerUtils;
|
||||||
import pro.taskana.mappings.TaskMonitorMapper;
|
import pro.taskana.mappings.TaskMonitorMapper;
|
||||||
import pro.taskana.report.ClassificationReport;
|
import pro.taskana.report.ClassificationReport;
|
||||||
|
|
@ -25,10 +25,10 @@ import pro.taskana.report.TimeIntervalReportBuilder;
|
||||||
/**
|
/**
|
||||||
* Implementation of {@link TimeIntervalReportBuilder}.
|
* Implementation of {@link TimeIntervalReportBuilder}.
|
||||||
* @param <B> the true Builder behind this Interface
|
* @param <B> the true Builder behind this Interface
|
||||||
* @param <I> the true DateQueryItem inside the Report
|
* @param <I> the true AgeQueryItem inside the Report
|
||||||
* @param <H> the column header
|
* @param <H> the column header
|
||||||
*/
|
*/
|
||||||
abstract class TimeIntervalReportBuilderImpl<B extends TimeIntervalReportBuilder<B, I, H>, I extends DateQueryItem, H extends TimeIntervalColumnHeader>
|
abstract class TimeIntervalReportBuilderImpl<B extends TimeIntervalReportBuilder<B, I, H>, I extends AgeQueryItem, H extends TimeIntervalColumnHeader>
|
||||||
implements TimeIntervalReportBuilder<B, I, H> {
|
implements TimeIntervalReportBuilder<B, I, H> {
|
||||||
|
|
||||||
private static final Logger LOGGER = LoggerFactory.getLogger(TimeIntervalReportBuilder.class);
|
private static final Logger LOGGER = LoggerFactory.getLogger(TimeIntervalReportBuilder.class);
|
||||||
|
|
|
||||||
|
|
@ -10,39 +10,39 @@ import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
import pro.taskana.TaskState;
|
import pro.taskana.TaskState;
|
||||||
import pro.taskana.TaskStatus;
|
import pro.taskana.impl.report.item.TimestampQueryItem;
|
||||||
|
import pro.taskana.report.Timestamp;
|
||||||
import pro.taskana.TaskanaEngine;
|
import pro.taskana.TaskanaEngine;
|
||||||
import pro.taskana.TaskanaRole;
|
import pro.taskana.TaskanaRole;
|
||||||
import pro.taskana.exceptions.InvalidArgumentException;
|
import pro.taskana.exceptions.InvalidArgumentException;
|
||||||
import pro.taskana.exceptions.NotAuthorizedException;
|
import pro.taskana.exceptions.NotAuthorizedException;
|
||||||
import pro.taskana.impl.report.header.TimeIntervalColumnHeader;
|
import pro.taskana.impl.report.header.TimeIntervalColumnHeader;
|
||||||
import pro.taskana.impl.report.item.DailyEntryExitQueryItem;
|
|
||||||
import pro.taskana.impl.report.preprocessor.DaysToWorkingDaysPreProcessor;
|
import pro.taskana.impl.report.preprocessor.DaysToWorkingDaysPreProcessor;
|
||||||
import pro.taskana.mappings.TaskMonitorMapper;
|
import pro.taskana.mappings.TaskMonitorMapper;
|
||||||
import pro.taskana.report.DailyEntryExitReport;
|
import pro.taskana.report.TimestampReport;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The implementation of {@link DailyEntryExitReport.Builder}.
|
* The implementation of {@link TimestampReport.Builder}.
|
||||||
*/
|
*/
|
||||||
public class DailyEntryExitReportBuilderImpl extends
|
public class TimestampReportBuilderImpl extends
|
||||||
TimeIntervalReportBuilderImpl<DailyEntryExitReport.Builder, DailyEntryExitQueryItem, TimeIntervalColumnHeader.Date>
|
TimeIntervalReportBuilderImpl<TimestampReport.Builder, TimestampQueryItem, TimeIntervalColumnHeader.Date>
|
||||||
implements DailyEntryExitReport.Builder {
|
implements TimestampReport.Builder {
|
||||||
|
|
||||||
private static final Logger LOGGER = LoggerFactory.getLogger(DailyEntryExitReport.Builder.class);
|
private static final Logger LOGGER = LoggerFactory.getLogger(TimestampReport.Builder.class);
|
||||||
private List<TaskStatus> status = Arrays.asList(TaskStatus.CREATED, TaskStatus.COMPLETED);
|
private List<Timestamp> status = Arrays.asList(Timestamp.CREATED, Timestamp.COMPLETED);
|
||||||
|
|
||||||
DailyEntryExitReportBuilderImpl(TaskanaEngine taskanaEngine, TaskMonitorMapper taskMonitorMapper) {
|
TimestampReportBuilderImpl(TaskanaEngine taskanaEngine, TaskMonitorMapper taskMonitorMapper) {
|
||||||
super(taskanaEngine, taskMonitorMapper);
|
super(taskanaEngine, taskMonitorMapper);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public DailyEntryExitReport.Builder stateIn(List<TaskState> states) {
|
public TimestampReport.Builder stateIn(List<TaskState> states) {
|
||||||
throw new UnsupportedOperationException(
|
throw new UnsupportedOperationException(
|
||||||
"The states have no influence regarding this report. Use statusIn instead");
|
"The states have no influence regarding this report. Use withTimestamps instead");
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected DailyEntryExitReport.Builder _this() {
|
protected TimestampReport.Builder _this() {
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -57,19 +57,19 @@ public class DailyEntryExitReportBuilderImpl extends
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public DailyEntryExitReport.Builder statusIn(List<TaskStatus> statuses) {
|
public TimestampReport.Builder withTimestamps(List<Timestamp> statuses) {
|
||||||
this.status = new ArrayList<>(statuses);
|
this.status = new ArrayList<>(statuses);
|
||||||
return _this();
|
return _this();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public DailyEntryExitReport buildReport() throws NotAuthorizedException, InvalidArgumentException {
|
public TimestampReport buildReport() throws NotAuthorizedException, InvalidArgumentException {
|
||||||
LOGGER.debug("entry to buildDetailedReport(), this = {}", this);
|
LOGGER.debug("entry to buildDetailedReport(), this = {}", this);
|
||||||
this.taskanaEngine.checkRoleMembership(TaskanaRole.MONITOR, TaskanaRole.ADMIN);
|
this.taskanaEngine.checkRoleMembership(TaskanaRole.MONITOR, TaskanaRole.ADMIN);
|
||||||
try {
|
try {
|
||||||
this.taskanaEngine.openConnection();
|
this.taskanaEngine.openConnection();
|
||||||
DailyEntryExitReport report = new DailyEntryExitReport(this.columnHeaders);
|
TimestampReport report = new TimestampReport(this.columnHeaders);
|
||||||
List<DailyEntryExitQueryItem> items = status.stream()
|
List<TimestampQueryItem> items = status.stream()
|
||||||
// This can also be implemented into a single sql query which combines all statuses with the union
|
// This can also be implemented into a single sql query which combines all statuses with the union
|
||||||
// operator. That would reduce the readability of the sql template. That's why "the loop" is done
|
// operator. That would reduce the readability of the sql template. That's why "the loop" is done
|
||||||
// outside of mybatis.
|
// outside of mybatis.
|
||||||
|
|
@ -86,7 +86,7 @@ public class DailyEntryExitReportBuilderImpl extends
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private List<DailyEntryExitQueryItem> getTasksCountForStatusGroupedByOrgLevel(TaskStatus s) {
|
private List<TimestampQueryItem> getTasksCountForStatusGroupedByOrgLevel(Timestamp s) {
|
||||||
return taskMonitorMapper.getTasksCountForStatusGroupedByOrgLevel(s, categories, classificationIds,
|
return taskMonitorMapper.getTasksCountForStatusGroupedByOrgLevel(s, categories, classificationIds,
|
||||||
excludedClassificationIds, domains, customAttributeFilter);
|
excludedClassificationIds, domains, customAttributeFilter);
|
||||||
}
|
}
|
||||||
|
|
@ -2,7 +2,7 @@ package pro.taskana.impl.report.header;
|
||||||
|
|
||||||
import pro.taskana.TaskState;
|
import pro.taskana.TaskState;
|
||||||
import pro.taskana.impl.report.item.TaskQueryItem;
|
import pro.taskana.impl.report.item.TaskQueryItem;
|
||||||
import pro.taskana.report.structure.ColumnHeader;
|
import pro.taskana.impl.report.structure.ColumnHeader;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The TaskStatusColumnHeader represents a column for each {@link TaskState}.
|
* The TaskStatusColumnHeader represents a column for each {@link TaskState}.
|
||||||
|
|
|
||||||
|
|
@ -4,8 +4,8 @@ import java.time.LocalDateTime;
|
||||||
import java.time.format.DateTimeFormatter;
|
import java.time.format.DateTimeFormatter;
|
||||||
import java.util.Locale;
|
import java.util.Locale;
|
||||||
|
|
||||||
import pro.taskana.impl.report.item.DateQueryItem;
|
import pro.taskana.impl.report.item.AgeQueryItem;
|
||||||
import pro.taskana.report.structure.ColumnHeader;
|
import pro.taskana.impl.report.structure.ColumnHeader;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A TimeIntervalColumnHeader has a lower and an upper age limit which subdivide the count of tasks into different
|
* A TimeIntervalColumnHeader has a lower and an upper age limit which subdivide the count of tasks into different
|
||||||
|
|
@ -15,7 +15,7 @@ import pro.taskana.report.structure.ColumnHeader;
|
||||||
* upperAgeLimit have to be equal. The outer cluster of a report should have open ends. These open ends are represented
|
* upperAgeLimit have to be equal. The outer cluster of a report should have open ends. These open ends are represented
|
||||||
* with Integer.MIN_VALUE and Integer.MAX_VALUE.
|
* with Integer.MIN_VALUE and Integer.MAX_VALUE.
|
||||||
*/
|
*/
|
||||||
public class TimeIntervalColumnHeader implements ColumnHeader<DateQueryItem> {
|
public class TimeIntervalColumnHeader implements ColumnHeader<AgeQueryItem> {
|
||||||
|
|
||||||
private final int lowerAgeLimit;
|
private final int lowerAgeLimit;
|
||||||
private final int upperAgeLimit;
|
private final int upperAgeLimit;
|
||||||
|
|
@ -49,7 +49,7 @@ public class TimeIntervalColumnHeader implements ColumnHeader<DateQueryItem> {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean fits(DateQueryItem item) {
|
public boolean fits(AgeQueryItem item) {
|
||||||
return lowerAgeLimit <= item.getAgeInDays() && upperAgeLimit >= item.getAgeInDays();
|
return lowerAgeLimit <= item.getAgeInDays() && upperAgeLimit >= item.getAgeInDays();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,11 +1,11 @@
|
||||||
package pro.taskana.impl.report.item;
|
package pro.taskana.impl.report.item;
|
||||||
|
|
||||||
import pro.taskana.report.structure.QueryItem;
|
import pro.taskana.impl.report.structure.QueryItem;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The MonitorQueryItem entity contains the number of tasks for a key (e.g. workbasketKey) and age in days.
|
* The MonitorQueryItem entity contains the number of tasks for a key (e.g. workbasketKey) and age in days.
|
||||||
*/
|
*/
|
||||||
public interface DateQueryItem extends QueryItem {
|
public interface AgeQueryItem extends QueryItem {
|
||||||
|
|
||||||
int getAgeInDays();
|
int getAgeInDays();
|
||||||
|
|
||||||
|
|
@ -3,7 +3,7 @@ package pro.taskana.impl.report.item;
|
||||||
/**
|
/**
|
||||||
* The MonitorQueryItem entity contains the number of tasks for a key (e.g. workbasketKey) and age in days.
|
* The MonitorQueryItem entity contains the number of tasks for a key (e.g. workbasketKey) and age in days.
|
||||||
*/
|
*/
|
||||||
public class MonitorQueryItem implements DateQueryItem {
|
public class MonitorQueryItem implements AgeQueryItem {
|
||||||
|
|
||||||
private String key;
|
private String key;
|
||||||
private int ageInDays;
|
private int ageInDays;
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
package pro.taskana.impl.report.item;
|
package pro.taskana.impl.report.item;
|
||||||
|
|
||||||
import pro.taskana.TaskState;
|
import pro.taskana.TaskState;
|
||||||
import pro.taskana.report.structure.QueryItem;
|
import pro.taskana.impl.report.structure.QueryItem;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The TaskQueryItem entity contains the number of tasks for a domain which have a specific state.
|
* The TaskQueryItem entity contains the number of tasks for a domain which have a specific state.
|
||||||
|
|
|
||||||
|
|
@ -1,15 +1,15 @@
|
||||||
package pro.taskana.impl.report.item;
|
package pro.taskana.impl.report.item;
|
||||||
|
|
||||||
import pro.taskana.TaskStatus;
|
import pro.taskana.report.Timestamp;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The DailyEntryExitQueryItem contains the necessary information for the {@link pro.taskana.report.DailyEntryExitReport}.
|
* The TimestampQueryItem contains the necessary information for the {@link pro.taskana.report.TimestampReport}.
|
||||||
*/
|
*/
|
||||||
public class DailyEntryExitQueryItem implements DateQueryItem {
|
public class TimestampQueryItem implements AgeQueryItem {
|
||||||
|
|
||||||
private static final String N_A = "N/A";
|
private static final String N_A = "N/A";
|
||||||
private int count;
|
private int count;
|
||||||
private TaskStatus status;
|
private Timestamp status;
|
||||||
private int ageInDays;
|
private int ageInDays;
|
||||||
private String orgLevel1;
|
private String orgLevel1;
|
||||||
private String orgLevel2;
|
private String orgLevel2;
|
||||||
|
|
@ -5,14 +5,14 @@ import java.util.List;
|
||||||
import pro.taskana.exceptions.InvalidArgumentException;
|
import pro.taskana.exceptions.InvalidArgumentException;
|
||||||
import pro.taskana.impl.DaysToWorkingDaysConverter;
|
import pro.taskana.impl.DaysToWorkingDaysConverter;
|
||||||
import pro.taskana.impl.report.header.TimeIntervalColumnHeader;
|
import pro.taskana.impl.report.header.TimeIntervalColumnHeader;
|
||||||
import pro.taskana.impl.report.item.DateQueryItem;
|
import pro.taskana.impl.report.item.AgeQueryItem;
|
||||||
import pro.taskana.report.structure.QueryItemPreprocessor;
|
import pro.taskana.impl.report.structure.QueryItemPreprocessor;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Uses {@link DaysToWorkingDaysConverter} to convert an <I>s age to working days.
|
* Uses {@link DaysToWorkingDaysConverter} to convert an <I>s age to working days.
|
||||||
* @param <I> QueryItem which is being processed
|
* @param <I> QueryItem which is being processed
|
||||||
*/
|
*/
|
||||||
public class DaysToWorkingDaysPreProcessor<I extends DateQueryItem> implements QueryItemPreprocessor<I> {
|
public class DaysToWorkingDaysPreProcessor<I extends AgeQueryItem> implements QueryItemPreprocessor<I> {
|
||||||
|
|
||||||
private DaysToWorkingDaysConverter instance;
|
private DaysToWorkingDaysConverter instance;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
package pro.taskana.impl.report.row;
|
package pro.taskana.impl.report.row;
|
||||||
|
|
||||||
import pro.taskana.impl.report.item.DetailedMonitorQueryItem;
|
import pro.taskana.impl.report.item.DetailedMonitorQueryItem;
|
||||||
import pro.taskana.report.structure.Row;
|
import pro.taskana.impl.report.structure.Row;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Represents a single Row inside {@link pro.taskana.report.ClassificationReport.DetailedClassificationReport}.
|
* Represents a single Row inside {@link pro.taskana.report.ClassificationReport.DetailedClassificationReport}.
|
||||||
|
|
|
||||||
|
|
@ -6,15 +6,15 @@ import java.util.Set;
|
||||||
import java.util.function.Function;
|
import java.util.function.Function;
|
||||||
|
|
||||||
import pro.taskana.impl.util.LoggerUtils;
|
import pro.taskana.impl.util.LoggerUtils;
|
||||||
import pro.taskana.report.structure.QueryItem;
|
import pro.taskana.impl.report.structure.QueryItem;
|
||||||
import pro.taskana.report.structure.Row;
|
import pro.taskana.impl.report.structure.Row;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The FoldableRow extends the {@link SingleRow}.
|
* The FoldableRow extends the {@link SingleRow}.
|
||||||
* In contrast to the {@link SingleRow} the FoldableRow contains rows which can be collapsed or expanded.
|
* In contrast to the {@link SingleRow} the FoldableRow contains rows which can be collapsed or expanded.
|
||||||
* The FoldableRow itself displays the sum of all foldable rows.
|
* The FoldableRow itself displays the sum of all foldable rows.
|
||||||
*
|
*
|
||||||
* @param <I> the {@link QueryItem} on which the {@link pro.taskana.report.structure.Report} is based on.
|
* @param <I> the {@link QueryItem} on which the {@link pro.taskana.impl.report.structure.Report} is based on.
|
||||||
*/
|
*/
|
||||||
public abstract class FoldableRow<I extends QueryItem> extends SingleRow<I> {
|
public abstract class FoldableRow<I extends QueryItem> extends SingleRow<I> {
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,13 +1,13 @@
|
||||||
package pro.taskana.impl.report.row;
|
package pro.taskana.impl.report.row;
|
||||||
|
|
||||||
import pro.taskana.report.structure.QueryItem;
|
import pro.taskana.impl.report.structure.QueryItem;
|
||||||
import pro.taskana.report.structure.Row;
|
import pro.taskana.impl.report.structure.Row;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A SingleRow represents a single row in a {@link pro.taskana.report.structure.Report}.
|
* A SingleRow represents a single row in a {@link pro.taskana.impl.report.structure.Report}.
|
||||||
* It contains an array of cells whose index corresponds to the {@link pro.taskana.report.structure.ColumnHeader} index in the {@link pro.taskana.report.structure.Report}.
|
* It contains an array of cells whose index corresponds to the {@link pro.taskana.impl.report.structure.ColumnHeader} index in the {@link pro.taskana.impl.report.structure.Report}.
|
||||||
*
|
*
|
||||||
* @param <I> {@link QueryItem} on which the {@link pro.taskana.report.structure.Report} is based on.
|
* @param <I> {@link QueryItem} on which the {@link pro.taskana.impl.report.structure.Report} is based on.
|
||||||
*/
|
*/
|
||||||
public class SingleRow<I extends QueryItem> implements Row<I> {
|
public class SingleRow<I extends QueryItem> implements Row<I> {
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,16 +1,16 @@
|
||||||
package pro.taskana.impl.report.row;
|
package pro.taskana.impl.report.row;
|
||||||
|
|
||||||
import pro.taskana.impl.report.item.DailyEntryExitQueryItem;
|
import pro.taskana.impl.report.item.TimestampQueryItem;
|
||||||
import pro.taskana.report.structure.Row;
|
import pro.taskana.impl.report.structure.Row;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A single Row inside the {@link pro.taskana.report.DailyEntryExitReport}.
|
* A single Row inside the {@link pro.taskana.report.TimestampReport}.
|
||||||
* It contains 4 sub-rows for each org level respectively.
|
* It contains 4 sub-rows for each org level respectively.
|
||||||
*/
|
*/
|
||||||
public class DailyEntryExitRow extends FoldableRow<DailyEntryExitQueryItem> {
|
public class TimestampRow extends FoldableRow<TimestampQueryItem> {
|
||||||
|
|
||||||
public DailyEntryExitRow(int columnSize) {
|
public TimestampRow(int columnSize) {
|
||||||
super(columnSize, DailyEntryExitQueryItem::getOrgLevel1);
|
super(columnSize, TimestampQueryItem::getOrgLevel1);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
@ -24,13 +24,13 @@ public class DailyEntryExitRow extends FoldableRow<DailyEntryExitQueryItem> {
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Row inside the {@link pro.taskana.report.DailyEntryExitReport} containing
|
* Row inside the {@link pro.taskana.report.TimestampReport} containing
|
||||||
* the information regarding a specific org level 1.
|
* the information regarding a specific org level 1.
|
||||||
*/
|
*/
|
||||||
public static final class OrgLevel1Row extends FoldableRow<DailyEntryExitQueryItem> {
|
public static final class OrgLevel1Row extends FoldableRow<TimestampQueryItem> {
|
||||||
|
|
||||||
private OrgLevel1Row(int columnSize) {
|
private OrgLevel1Row(int columnSize) {
|
||||||
super(columnSize, DailyEntryExitQueryItem::getOrgLevel2);
|
super(columnSize, TimestampQueryItem::getOrgLevel2);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
@ -45,13 +45,13 @@ public class DailyEntryExitRow extends FoldableRow<DailyEntryExitQueryItem> {
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Row inside the {@link pro.taskana.report.DailyEntryExitReport} containing
|
* Row inside the {@link pro.taskana.report.TimestampReport} containing
|
||||||
* the information regarding a specific org level 2.
|
* the information regarding a specific org level 2.
|
||||||
*/
|
*/
|
||||||
public static final class OrgLevel2Row extends FoldableRow<DailyEntryExitQueryItem> {
|
public static final class OrgLevel2Row extends FoldableRow<TimestampQueryItem> {
|
||||||
|
|
||||||
private OrgLevel2Row(int columnSize) {
|
private OrgLevel2Row(int columnSize) {
|
||||||
super(columnSize, DailyEntryExitQueryItem::getOrgLevel3);
|
super(columnSize, TimestampQueryItem::getOrgLevel3);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
@ -66,23 +66,23 @@ public class DailyEntryExitRow extends FoldableRow<DailyEntryExitQueryItem> {
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Row inside the {@link pro.taskana.report.DailyEntryExitReport} containing
|
* Row inside the {@link pro.taskana.report.TimestampReport} containing
|
||||||
* the information regarding a specific org level 3.
|
* the information regarding a specific org level 3.
|
||||||
*/
|
*/
|
||||||
public static final class OrgLevel3Row extends FoldableRow<DailyEntryExitQueryItem> {
|
public static final class OrgLevel3Row extends FoldableRow<TimestampQueryItem> {
|
||||||
|
|
||||||
private OrgLevel3Row(int columnSize) {
|
private OrgLevel3Row(int columnSize) {
|
||||||
super(columnSize, DailyEntryExitQueryItem::getOrgLevel4);
|
super(columnSize, TimestampQueryItem::getOrgLevel4);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
Row<DailyEntryExitQueryItem> buildRow(int columnSize) {
|
Row<TimestampQueryItem> buildRow(int columnSize) {
|
||||||
return new SingleRow<>(columnSize);
|
return new SingleRow<>(columnSize);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public SingleRow<DailyEntryExitQueryItem> getFoldableRow(String key) {
|
public SingleRow<TimestampQueryItem> getFoldableRow(String key) {
|
||||||
return (SingleRow<DailyEntryExitQueryItem>) super.getFoldableRow(key);
|
return (SingleRow<TimestampQueryItem>) super.getFoldableRow(key);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
package pro.taskana.report.structure;
|
package pro.taskana.impl.report.structure;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A ColumnHeader is an element of a {@link Report}.
|
* A ColumnHeader is an element of a {@link Report}.
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
package pro.taskana.report.structure;
|
package pro.taskana.impl.report.structure;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A QueryItem is en entity on which a {@link Report} is based on.
|
* A QueryItem is en entity on which a {@link Report} is based on.
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
package pro.taskana.report.structure;
|
package pro.taskana.impl.report.structure;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The QueryItemPreprocessor is used when adding {@link QueryItem}s into a {@link Report}. It defines a processing
|
* The QueryItemPreprocessor is used when adding {@link QueryItem}s into a {@link Report}. It defines a processing
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
package pro.taskana.report.structure;
|
package pro.taskana.impl.report.structure;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.LinkedHashMap;
|
import java.util.LinkedHashMap;
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
package pro.taskana.report.structure;
|
package pro.taskana.impl.report.structure;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Representation of a row in a {@link Report}.
|
* Representation of a row in a {@link Report}.
|
||||||
|
|
@ -10,10 +10,10 @@ import org.apache.ibatis.annotations.Select;
|
||||||
|
|
||||||
import pro.taskana.CustomField;
|
import pro.taskana.CustomField;
|
||||||
import pro.taskana.TaskState;
|
import pro.taskana.TaskState;
|
||||||
import pro.taskana.TaskStatus;
|
import pro.taskana.report.Timestamp;
|
||||||
import pro.taskana.impl.SelectedItem;
|
import pro.taskana.impl.SelectedItem;
|
||||||
import pro.taskana.impl.report.CombinedClassificationFilter;
|
import pro.taskana.impl.report.CombinedClassificationFilter;
|
||||||
import pro.taskana.impl.report.item.DailyEntryExitQueryItem;
|
import pro.taskana.impl.report.item.TimestampQueryItem;
|
||||||
import pro.taskana.impl.report.item.DetailedMonitorQueryItem;
|
import pro.taskana.impl.report.item.DetailedMonitorQueryItem;
|
||||||
import pro.taskana.impl.report.item.MonitorQueryItem;
|
import pro.taskana.impl.report.item.MonitorQueryItem;
|
||||||
import pro.taskana.impl.report.item.TaskQueryItem;
|
import pro.taskana.impl.report.item.TaskQueryItem;
|
||||||
|
|
@ -426,7 +426,7 @@ public interface TaskMonitorMapper {
|
||||||
@Result(column = "ORG_LEVEL_3", property = "orgLevel3"),
|
@Result(column = "ORG_LEVEL_3", property = "orgLevel3"),
|
||||||
@Result(column = "ORG_LEVEL_4", property = "orgLevel4")
|
@Result(column = "ORG_LEVEL_4", property = "orgLevel4")
|
||||||
})
|
})
|
||||||
List<DailyEntryExitQueryItem> getTasksCountForStatusGroupedByOrgLevel(@Param("status") TaskStatus status,
|
List<TimestampQueryItem> getTasksCountForStatusGroupedByOrgLevel(@Param("status") Timestamp status,
|
||||||
@Param("categories") List<String> categories, @Param("classificationIds") List<String> classificationIds,
|
@Param("categories") List<String> categories, @Param("classificationIds") List<String> classificationIds,
|
||||||
@Param("excludedClassificationIds") List<String> excludedClassificationIds,
|
@Param("excludedClassificationIds") List<String> excludedClassificationIds,
|
||||||
@Param("domains") List<String> domains,
|
@Param("domains") List<String> domains,
|
||||||
|
|
|
||||||
|
|
@ -6,7 +6,7 @@ import pro.taskana.exceptions.InvalidArgumentException;
|
||||||
import pro.taskana.exceptions.NotAuthorizedException;
|
import pro.taskana.exceptions.NotAuthorizedException;
|
||||||
import pro.taskana.impl.report.header.TimeIntervalColumnHeader;
|
import pro.taskana.impl.report.header.TimeIntervalColumnHeader;
|
||||||
import pro.taskana.impl.report.item.MonitorQueryItem;
|
import pro.taskana.impl.report.item.MonitorQueryItem;
|
||||||
import pro.taskana.report.structure.Report;
|
import pro.taskana.impl.report.structure.Report;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A CategoryReport contains the total numbers of tasks of the respective category as well as the total number of
|
* A CategoryReport contains the total numbers of tasks of the respective category as well as the total number of
|
||||||
|
|
|
||||||
|
|
@ -8,10 +8,10 @@ import pro.taskana.impl.report.header.TimeIntervalColumnHeader;
|
||||||
import pro.taskana.impl.report.item.DetailedMonitorQueryItem;
|
import pro.taskana.impl.report.item.DetailedMonitorQueryItem;
|
||||||
import pro.taskana.impl.report.item.MonitorQueryItem;
|
import pro.taskana.impl.report.item.MonitorQueryItem;
|
||||||
import pro.taskana.impl.report.row.DetailedClassificationRow;
|
import pro.taskana.impl.report.row.DetailedClassificationRow;
|
||||||
import pro.taskana.report.structure.Report;
|
import pro.taskana.impl.report.structure.Report;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The ClassificationReport extends the Report. The {@link pro.taskana.report.structure.Row}s of the ClassificationReport are grouped by
|
* The ClassificationReport extends the Report. The {@link pro.taskana.impl.report.structure.Row}s of the ClassificationReport are grouped by
|
||||||
* classifications.
|
* classifications.
|
||||||
*/
|
*/
|
||||||
public class ClassificationReport extends Report<MonitorQueryItem, TimeIntervalColumnHeader> {
|
public class ClassificationReport extends Report<MonitorQueryItem, TimeIntervalColumnHeader> {
|
||||||
|
|
@ -32,7 +32,7 @@ public class ClassificationReport extends Report<MonitorQueryItem, TimeIntervalC
|
||||||
* Returns a {@link DetailedClassificationReport} containing all tasks after applying the filters. If the column
|
* Returns a {@link DetailedClassificationReport} containing all tasks after applying the filters. If the column
|
||||||
* headers are set the report is subdivided into clusters. Its
|
* headers are set the report is subdivided into clusters. Its
|
||||||
* {@link pro.taskana.impl.report.row.FoldableRow}s contain an additional list of
|
* {@link pro.taskana.impl.report.row.FoldableRow}s contain an additional list of
|
||||||
* {@link pro.taskana.report.structure.Row}s for the classifications of the attachments of the tasks.
|
* {@link pro.taskana.impl.report.structure.Row}s for the classifications of the attachments of the tasks.
|
||||||
*
|
*
|
||||||
* @throws InvalidArgumentException
|
* @throws InvalidArgumentException
|
||||||
* if the column headers are not initialized
|
* if the column headers are not initialized
|
||||||
|
|
@ -45,7 +45,7 @@ public class ClassificationReport extends Report<MonitorQueryItem, TimeIntervalC
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The DetailedClassificationReport is a functional extension of the {@link ClassificationReport}.
|
* The DetailedClassificationReport is a functional extension of the {@link ClassificationReport}.
|
||||||
* Its {@link pro.taskana.impl.report.row.FoldableRow}s contain an additional list of {@link pro.taskana.report.structure.Row}s
|
* Its {@link pro.taskana.impl.report.row.FoldableRow}s contain an additional list of {@link pro.taskana.impl.report.structure.Row}s
|
||||||
* for the classifications of the attachments of the tasks.
|
* for the classifications of the attachments of the tasks.
|
||||||
*/
|
*/
|
||||||
public static class DetailedClassificationReport
|
public static class DetailedClassificationReport
|
||||||
|
|
|
||||||
|
|
@ -7,7 +7,7 @@ import pro.taskana.exceptions.InvalidArgumentException;
|
||||||
import pro.taskana.exceptions.NotAuthorizedException;
|
import pro.taskana.exceptions.NotAuthorizedException;
|
||||||
import pro.taskana.impl.report.header.TimeIntervalColumnHeader;
|
import pro.taskana.impl.report.header.TimeIntervalColumnHeader;
|
||||||
import pro.taskana.impl.report.item.MonitorQueryItem;
|
import pro.taskana.impl.report.item.MonitorQueryItem;
|
||||||
import pro.taskana.report.structure.Report;
|
import pro.taskana.impl.report.structure.Report;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A CustomFieldValueReport contains the total numbers of tasks of the respective custom field as well as
|
* A CustomFieldValueReport contains the total numbers of tasks of the respective custom field as well as
|
||||||
|
|
|
||||||
|
|
@ -1,43 +0,0 @@
|
||||||
package pro.taskana.report;
|
|
||||||
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
import pro.taskana.TaskStatus;
|
|
||||||
import pro.taskana.exceptions.InvalidArgumentException;
|
|
||||||
import pro.taskana.exceptions.NotAuthorizedException;
|
|
||||||
import pro.taskana.impl.report.header.TimeIntervalColumnHeader;
|
|
||||||
import pro.taskana.impl.report.item.DailyEntryExitQueryItem;
|
|
||||||
import pro.taskana.impl.report.row.DailyEntryExitRow;
|
|
||||||
import pro.taskana.report.structure.Report;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* A {@link DailyEntryExitReport} displays created and competed tasks for a specific dates.
|
|
||||||
*/
|
|
||||||
public class DailyEntryExitReport extends Report<DailyEntryExitQueryItem, TimeIntervalColumnHeader.Date> {
|
|
||||||
|
|
||||||
public DailyEntryExitReport(List<TimeIntervalColumnHeader.Date> dates) {
|
|
||||||
super(dates, "STATES");
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected DailyEntryExitRow createRow(int columnSize) {
|
|
||||||
return new DailyEntryExitRow(columnSize);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public DailyEntryExitRow getRow(String key) {
|
|
||||||
return (DailyEntryExitRow) super.getRow(key);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Builder for {@link DailyEntryExitReport}.
|
|
||||||
*/
|
|
||||||
public interface Builder extends
|
|
||||||
TimeIntervalReportBuilder<DailyEntryExitReport.Builder, DailyEntryExitQueryItem, TimeIntervalColumnHeader.Date> {
|
|
||||||
|
|
||||||
@Override
|
|
||||||
DailyEntryExitReport buildReport() throws NotAuthorizedException, InvalidArgumentException;
|
|
||||||
|
|
||||||
Builder statusIn(List<TaskStatus> statuses);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -9,7 +9,7 @@ import pro.taskana.exceptions.InvalidArgumentException;
|
||||||
import pro.taskana.exceptions.NotAuthorizedException;
|
import pro.taskana.exceptions.NotAuthorizedException;
|
||||||
import pro.taskana.impl.report.item.TaskQueryItem;
|
import pro.taskana.impl.report.item.TaskQueryItem;
|
||||||
import pro.taskana.impl.report.header.TaskStatusColumnHeader;
|
import pro.taskana.impl.report.header.TaskStatusColumnHeader;
|
||||||
import pro.taskana.report.structure.Report;
|
import pro.taskana.impl.report.structure.Report;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A TaskStatusReport contains the total number of tasks, clustered in their task status.
|
* A TaskStatusReport contains the total number of tasks, clustered in their task status.
|
||||||
|
|
|
||||||
|
|
@ -9,16 +9,16 @@ import pro.taskana.exceptions.InvalidArgumentException;
|
||||||
import pro.taskana.exceptions.NotAuthorizedException;
|
import pro.taskana.exceptions.NotAuthorizedException;
|
||||||
import pro.taskana.impl.SelectedItem;
|
import pro.taskana.impl.SelectedItem;
|
||||||
import pro.taskana.impl.report.header.TimeIntervalColumnHeader;
|
import pro.taskana.impl.report.header.TimeIntervalColumnHeader;
|
||||||
import pro.taskana.impl.report.item.DateQueryItem;
|
import pro.taskana.impl.report.item.AgeQueryItem;
|
||||||
import pro.taskana.report.structure.Report;
|
import pro.taskana.impl.report.structure.Report;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* "Super" Interface for all TimeIntervalReportBuilders.
|
* "Super" Interface for all TimeIntervalReportBuilders.
|
||||||
* @param <B> the true Builder behind this Interface.
|
* @param <B> the true Builder behind this Interface.
|
||||||
* @param <I> the DateQueryItem which will be inserted into the Report.
|
* @param <I> the AgeQueryItem which will be inserted into the Report.
|
||||||
* @param <H> the column Header
|
* @param <H> the column Header
|
||||||
*/
|
*/
|
||||||
public interface TimeIntervalReportBuilder<B extends TimeIntervalReportBuilder<B, I, H>, I extends DateQueryItem, H extends TimeIntervalColumnHeader>
|
public interface TimeIntervalReportBuilder<B extends TimeIntervalReportBuilder<B, I, H>, I extends AgeQueryItem, H extends TimeIntervalColumnHeader>
|
||||||
extends Report.Builder<I, H> {
|
extends Report.Builder<I, H> {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,8 @@
|
||||||
|
package pro.taskana.report;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This enum contains all timestamps saved in the database table for a {@link pro.taskana.Task}.
|
||||||
|
*/
|
||||||
|
public enum Timestamp {
|
||||||
|
CREATED, CLAIMED, COMPLETED, MODIFIED, PLANNED, DUE
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,42 @@
|
||||||
|
package pro.taskana.report;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import pro.taskana.exceptions.InvalidArgumentException;
|
||||||
|
import pro.taskana.exceptions.NotAuthorizedException;
|
||||||
|
import pro.taskana.impl.report.header.TimeIntervalColumnHeader;
|
||||||
|
import pro.taskana.impl.report.item.TimestampQueryItem;
|
||||||
|
import pro.taskana.impl.report.row.TimestampRow;
|
||||||
|
import pro.taskana.impl.report.structure.Report;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A {@link TimestampReport} displays created and competed tasks for a specific dates.
|
||||||
|
*/
|
||||||
|
public class TimestampReport extends Report<TimestampQueryItem, TimeIntervalColumnHeader.Date> {
|
||||||
|
|
||||||
|
public TimestampReport(List<TimeIntervalColumnHeader.Date> dates) {
|
||||||
|
super(dates, "STATES");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected TimestampRow createRow(int columnSize) {
|
||||||
|
return new TimestampRow(columnSize);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public TimestampRow getRow(String key) {
|
||||||
|
return (TimestampRow) super.getRow(key);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Builder for {@link TimestampReport}.
|
||||||
|
*/
|
||||||
|
public interface Builder extends
|
||||||
|
TimeIntervalReportBuilder<TimestampReport.Builder, TimestampQueryItem, TimeIntervalColumnHeader.Date> {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
TimestampReport buildReport() throws NotAuthorizedException, InvalidArgumentException;
|
||||||
|
|
||||||
|
Builder withTimestamps(List<Timestamp> statuses);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -7,7 +7,7 @@ import pro.taskana.exceptions.NotAuthorizedException;
|
||||||
import pro.taskana.impl.report.CombinedClassificationFilter;
|
import pro.taskana.impl.report.CombinedClassificationFilter;
|
||||||
import pro.taskana.impl.report.header.TimeIntervalColumnHeader;
|
import pro.taskana.impl.report.header.TimeIntervalColumnHeader;
|
||||||
import pro.taskana.impl.report.item.MonitorQueryItem;
|
import pro.taskana.impl.report.item.MonitorQueryItem;
|
||||||
import pro.taskana.report.structure.Report;
|
import pro.taskana.impl.report.structure.Report;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A WorkbasketReport contains the total numbers of tasks of the respective workbasket as well as the
|
* A WorkbasketReport contains the total numbers of tasks of the respective workbasket as well as the
|
||||||
|
|
|
||||||
|
|
@ -25,7 +25,7 @@ import pro.taskana.impl.report.header.TimeIntervalColumnHeader;
|
||||||
import pro.taskana.impl.report.item.DetailedMonitorQueryItem;
|
import pro.taskana.impl.report.item.DetailedMonitorQueryItem;
|
||||||
import pro.taskana.impl.report.row.FoldableRow;
|
import pro.taskana.impl.report.row.FoldableRow;
|
||||||
import pro.taskana.report.ClassificationReport.DetailedClassificationReport;
|
import pro.taskana.report.ClassificationReport.DetailedClassificationReport;
|
||||||
import pro.taskana.report.structure.Row;
|
import pro.taskana.impl.report.structure.Row;
|
||||||
import pro.taskana.security.JAASRunner;
|
import pro.taskana.security.JAASRunner;
|
||||||
import pro.taskana.security.WithAccessId;
|
import pro.taskana.security.WithAccessId;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -19,7 +19,7 @@ import pro.taskana.exceptions.InvalidArgumentException;
|
||||||
import pro.taskana.exceptions.NotAuthorizedException;
|
import pro.taskana.exceptions.NotAuthorizedException;
|
||||||
import pro.taskana.impl.report.header.TaskStatusColumnHeader;
|
import pro.taskana.impl.report.header.TaskStatusColumnHeader;
|
||||||
import pro.taskana.impl.report.item.TaskQueryItem;
|
import pro.taskana.impl.report.item.TaskQueryItem;
|
||||||
import pro.taskana.report.structure.Row;
|
import pro.taskana.impl.report.structure.Row;
|
||||||
import pro.taskana.report.TaskStatusReport;
|
import pro.taskana.report.TaskStatusReport;
|
||||||
import pro.taskana.security.JAASRunner;
|
import pro.taskana.security.JAASRunner;
|
||||||
import pro.taskana.security.WithAccessId;
|
import pro.taskana.security.WithAccessId;
|
||||||
|
|
|
||||||
|
|
@ -15,21 +15,21 @@ import org.junit.runner.RunWith;
|
||||||
|
|
||||||
import pro.taskana.TaskMonitorService;
|
import pro.taskana.TaskMonitorService;
|
||||||
import pro.taskana.impl.report.header.TimeIntervalColumnHeader;
|
import pro.taskana.impl.report.header.TimeIntervalColumnHeader;
|
||||||
import pro.taskana.impl.report.item.DailyEntryExitQueryItem;
|
import pro.taskana.impl.report.item.TimestampQueryItem;
|
||||||
import pro.taskana.impl.report.row.DailyEntryExitRow;
|
import pro.taskana.impl.report.row.TimestampRow;
|
||||||
import pro.taskana.impl.report.row.SingleRow;
|
import pro.taskana.impl.report.row.SingleRow;
|
||||||
import pro.taskana.report.DailyEntryExitReport;
|
import pro.taskana.report.TimestampReport;
|
||||||
import pro.taskana.security.JAASRunner;
|
import pro.taskana.security.JAASRunner;
|
||||||
import pro.taskana.security.WithAccessId;
|
import pro.taskana.security.WithAccessId;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Test class for {@link pro.taskana.report.DailyEntryExitReport}.
|
* Test class for {@link TimestampReport}.
|
||||||
*/
|
*/
|
||||||
@RunWith(JAASRunner.class)
|
@RunWith(JAASRunner.class)
|
||||||
public class ProvideDailyEntryExitReportAccTest extends AbstractReportAccTest {
|
public class ProvideTimestampReportAccTest extends AbstractReportAccTest {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This test covers every insert operation of the DailyEntryExitReport.
|
* This test covers every insert operation of the TimestampReport.
|
||||||
* We have two definitions for org level 1: 'org1' and 'N/A'.
|
* We have two definitions for org level 1: 'org1' and 'N/A'.
|
||||||
* All other org levels only contain 'N/A'. Thus this test only tests the separation for org level1.
|
* All other org levels only contain 'N/A'. Thus this test only tests the separation for org level1.
|
||||||
* Since every OrgLevelRow is a FoldableRow this is sufficient
|
* Since every OrgLevelRow is a FoldableRow this is sufficient
|
||||||
|
|
@ -40,25 +40,25 @@ public class ProvideDailyEntryExitReportAccTest extends AbstractReportAccTest {
|
||||||
@WithAccessId(userName = "monitor")
|
@WithAccessId(userName = "monitor")
|
||||||
@Test
|
@Test
|
||||||
public void testProperInsertionOfQueryItems() throws Exception {
|
public void testProperInsertionOfQueryItems() throws Exception {
|
||||||
TaskMonitorService mapper = taskanaEngine.getTaskMonitorService();
|
TaskMonitorService taskMonitorService = taskanaEngine.getTaskMonitorService();
|
||||||
|
|
||||||
//last 14 days. Today excluded.
|
//last 14 days. Today excluded.
|
||||||
List<TimeIntervalColumnHeader.Date> collect = IntStream.range(-14, 0)
|
List<TimeIntervalColumnHeader.Date> headers = IntStream.range(-14, 0)
|
||||||
.mapToObj(TimeIntervalColumnHeader.Date::new)
|
.mapToObj(TimeIntervalColumnHeader.Date::new)
|
||||||
.collect(Collectors.toList());
|
.collect(Collectors.toList());
|
||||||
DailyEntryExitReport dailyEntryExitReport = mapper.createDailyEntryExitReportBuilder()
|
TimestampReport timestampReport = taskMonitorService.createTimestampReportBuilder()
|
||||||
.withColumnHeaders(collect)
|
.withColumnHeaders(headers)
|
||||||
.buildReport();
|
.buildReport();
|
||||||
final HashSet<String> org1Set = new HashSet<>(Arrays.asList("N/A", "org1"));
|
final HashSet<String> org1Set = new HashSet<>(Arrays.asList("N/A", "org1"));
|
||||||
final HashSet<String> allOtherOrgLevelSet = new HashSet<>(Collections.singletonList("N/A"));
|
final HashSet<String> allOtherOrgLevelSet = new HashSet<>(Collections.singletonList("N/A"));
|
||||||
|
|
||||||
assertEquals(2, dailyEntryExitReport.getRows().size());
|
assertEquals(2, timestampReport.getRows().size());
|
||||||
assertEquals(new HashSet<>(Arrays.asList("CREATED", "COMPLETED")),
|
assertEquals(new HashSet<>(Arrays.asList("CREATED", "COMPLETED")),
|
||||||
dailyEntryExitReport.getRows().keySet());
|
timestampReport.getRows().keySet());
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * * * * * * TEST THE CREATED ROW * * * * * * * * * * * * * * * * * * * * *
|
// * * * * * * * * * * * * * * * * * * * * * TEST THE CREATED ROW * * * * * * * * * * * * * * * * * * * * *
|
||||||
|
|
||||||
DailyEntryExitRow statusRow = dailyEntryExitReport.getRow("CREATED");
|
TimestampRow statusRow = timestampReport.getRow("CREATED");
|
||||||
assertEquals(2, statusRow.getFoldableRowCount());
|
assertEquals(2, statusRow.getFoldableRowCount());
|
||||||
assertEquals(org1Set, statusRow.getFoldableRowKeySet());
|
assertEquals(org1Set, statusRow.getFoldableRowKeySet());
|
||||||
// 2 Entries with -8 days and one with -9 days.
|
// 2 Entries with -8 days and one with -9 days.
|
||||||
|
|
@ -66,7 +66,7 @@ public class ProvideDailyEntryExitReportAccTest extends AbstractReportAccTest {
|
||||||
assertEquals(3, statusRow.getTotalValue());
|
assertEquals(3, statusRow.getTotalValue());
|
||||||
|
|
||||||
// 'CREATED' -> 'org1'
|
// 'CREATED' -> 'org1'
|
||||||
DailyEntryExitRow.OrgLevel1Row org1Row = statusRow.getFoldableRow("org1");
|
TimestampRow.OrgLevel1Row org1Row = statusRow.getFoldableRow("org1");
|
||||||
assertEquals(1, org1Row.getFoldableRowCount());
|
assertEquals(1, org1Row.getFoldableRowCount());
|
||||||
assertEquals(allOtherOrgLevelSet, org1Row.getFoldableRowKeySet());
|
assertEquals(allOtherOrgLevelSet, org1Row.getFoldableRowKeySet());
|
||||||
// only task TKI:000000000000000000000000000000000029 in 'org1'.
|
// only task TKI:000000000000000000000000000000000029 in 'org1'.
|
||||||
|
|
@ -74,7 +74,7 @@ public class ProvideDailyEntryExitReportAccTest extends AbstractReportAccTest {
|
||||||
assertEquals(1, org1Row.getTotalValue());
|
assertEquals(1, org1Row.getTotalValue());
|
||||||
|
|
||||||
// 'CREATED' -> 'org1'/'N/A'
|
// 'CREATED' -> 'org1'/'N/A'
|
||||||
DailyEntryExitRow.OrgLevel2Row org2Row = org1Row.getFoldableRow("N/A");
|
TimestampRow.OrgLevel2Row org2Row = org1Row.getFoldableRow("N/A");
|
||||||
assertEquals(1, org2Row.getFoldableRowCount());
|
assertEquals(1, org2Row.getFoldableRowCount());
|
||||||
assertEquals(allOtherOrgLevelSet, org2Row.getFoldableRowKeySet());
|
assertEquals(allOtherOrgLevelSet, org2Row.getFoldableRowKeySet());
|
||||||
// Since no further separation (in org level) they should be the same.
|
// Since no further separation (in org level) they should be the same.
|
||||||
|
|
@ -82,7 +82,7 @@ public class ProvideDailyEntryExitReportAccTest extends AbstractReportAccTest {
|
||||||
assertEquals(org1Row.getTotalValue(), org2Row.getTotalValue());
|
assertEquals(org1Row.getTotalValue(), org2Row.getTotalValue());
|
||||||
|
|
||||||
// 'CREATED' -> 'org1'/'N/A'/'N/A'
|
// 'CREATED' -> 'org1'/'N/A'/'N/A'
|
||||||
DailyEntryExitRow.OrgLevel3Row org3Row = org2Row.getFoldableRow("N/A");
|
TimestampRow.OrgLevel3Row org3Row = org2Row.getFoldableRow("N/A");
|
||||||
assertEquals(1, org2Row.getFoldableRowCount());
|
assertEquals(1, org2Row.getFoldableRowCount());
|
||||||
assertEquals(allOtherOrgLevelSet, org3Row.getFoldableRowKeySet());
|
assertEquals(allOtherOrgLevelSet, org3Row.getFoldableRowKeySet());
|
||||||
// Since no further separation (in org level) they should be the same.
|
// Since no further separation (in org level) they should be the same.
|
||||||
|
|
@ -90,7 +90,7 @@ public class ProvideDailyEntryExitReportAccTest extends AbstractReportAccTest {
|
||||||
assertEquals(org2Row.getTotalValue(), org3Row.getTotalValue());
|
assertEquals(org2Row.getTotalValue(), org3Row.getTotalValue());
|
||||||
|
|
||||||
// 'CREATED' -> 'org1'/'N/A'/'N/A'/'N/A'
|
// 'CREATED' -> 'org1'/'N/A'/'N/A'/'N/A'
|
||||||
SingleRow<DailyEntryExitQueryItem> org4Row = org3Row.getFoldableRow("N/A");
|
SingleRow<TimestampQueryItem> org4Row = org3Row.getFoldableRow("N/A");
|
||||||
// Since no further separation (in org level) they should be the same.
|
// Since no further separation (in org level) they should be the same.
|
||||||
assertArrayEquals(org3Row.getCells(), org4Row.getCells());
|
assertArrayEquals(org3Row.getCells(), org4Row.getCells());
|
||||||
assertEquals(org3Row.getTotalValue(), org4Row.getTotalValue());
|
assertEquals(org3Row.getTotalValue(), org4Row.getTotalValue());
|
||||||
|
|
@ -128,7 +128,7 @@ public class ProvideDailyEntryExitReportAccTest extends AbstractReportAccTest {
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * * * * * * TEST THE COMPLETED ROW * * * * * * * * * * * * * * * * * * * * *
|
// * * * * * * * * * * * * * * * * * * * * * TEST THE COMPLETED ROW * * * * * * * * * * * * * * * * * * * * *
|
||||||
|
|
||||||
statusRow = dailyEntryExitReport.getRow("COMPLETED");
|
statusRow = timestampReport.getRow("COMPLETED");
|
||||||
assertEquals(2, statusRow.getFoldableRowCount());
|
assertEquals(2, statusRow.getFoldableRowCount());
|
||||||
assertEquals(org1Set, statusRow.getFoldableRowKeySet());
|
assertEquals(org1Set, statusRow.getFoldableRowKeySet());
|
||||||
// 2 Entries with -1 days, one with -2 days and one with -7 days.
|
// 2 Entries with -1 days, one with -2 days and one with -7 days.
|
||||||
|
|
@ -6,8 +6,6 @@ import static org.mockito.Mockito.doNothing;
|
||||||
import static org.mockito.Mockito.doReturn;
|
import static org.mockito.Mockito.doReturn;
|
||||||
import static org.mockito.Mockito.verifyNoMoreInteractions;
|
import static org.mockito.Mockito.verifyNoMoreInteractions;
|
||||||
|
|
||||||
import java.time.Instant;
|
|
||||||
import java.time.temporal.ChronoUnit;
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import org.apache.ibatis.session.SqlSession;
|
import org.apache.ibatis.session.SqlSession;
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
package pro.taskana.report.structure;
|
package pro.taskana.impl.report.structure;
|
||||||
|
|
||||||
import static org.junit.Assert.assertArrayEquals;
|
import static org.junit.Assert.assertArrayEquals;
|
||||||
import static org.junit.Assert.assertEquals;
|
import static org.junit.Assert.assertEquals;
|
||||||
|
|
@ -100,7 +100,7 @@ public class MonitorController {
|
||||||
.collect(Collectors.toList());
|
.collect(Collectors.toList());
|
||||||
return ResponseEntity.status(HttpStatus.OK)
|
return ResponseEntity.status(HttpStatus.OK)
|
||||||
.body(reportAssembler.toResource(
|
.body(reportAssembler.toResource(
|
||||||
taskMonitorService.createDailyEntryExitReportBuilder()
|
taskMonitorService.createTimestampReportBuilder()
|
||||||
.withColumnHeaders(columnHeaders)
|
.withColumnHeaders(columnHeaders)
|
||||||
.buildReport()));
|
.buildReport()));
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -17,13 +17,13 @@ import pro.taskana.exceptions.NotAuthorizedException;
|
||||||
import pro.taskana.impl.report.row.FoldableRow;
|
import pro.taskana.impl.report.row.FoldableRow;
|
||||||
import pro.taskana.impl.report.row.SingleRow;
|
import pro.taskana.impl.report.row.SingleRow;
|
||||||
import pro.taskana.report.ClassificationReport;
|
import pro.taskana.report.ClassificationReport;
|
||||||
import pro.taskana.report.DailyEntryExitReport;
|
import pro.taskana.report.TimestampReport;
|
||||||
import pro.taskana.report.TaskStatusReport;
|
import pro.taskana.report.TaskStatusReport;
|
||||||
import pro.taskana.report.WorkbasketReport;
|
import pro.taskana.report.WorkbasketReport;
|
||||||
import pro.taskana.report.structure.ColumnHeader;
|
import pro.taskana.impl.report.structure.ColumnHeader;
|
||||||
import pro.taskana.report.structure.QueryItem;
|
import pro.taskana.impl.report.structure.QueryItem;
|
||||||
import pro.taskana.report.structure.Report;
|
import pro.taskana.impl.report.structure.Report;
|
||||||
import pro.taskana.report.structure.Row;
|
import pro.taskana.impl.report.structure.Row;
|
||||||
import pro.taskana.rest.MonitorController;
|
import pro.taskana.rest.MonitorController;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -59,7 +59,7 @@ public class ReportAssembler {
|
||||||
return resource;
|
return resource;
|
||||||
}
|
}
|
||||||
|
|
||||||
public ReportResource toResource(DailyEntryExitReport report)
|
public ReportResource toResource(TimestampReport report)
|
||||||
throws NotAuthorizedException, InvalidArgumentException {
|
throws NotAuthorizedException, InvalidArgumentException {
|
||||||
ReportResource resource = toReportResource(report);
|
ReportResource resource = toReportResource(report);
|
||||||
resource.add(linkTo(methodOn(MonitorController.class).getDailyEntryExitReport()).withSelfRel().expand());
|
resource.add(linkTo(methodOn(MonitorController.class).getDailyEntryExitReport()).withSelfRel().expand());
|
||||||
|
|
@ -74,7 +74,7 @@ public class ReportAssembler {
|
||||||
Report<I, H> report, Instant time) {
|
Report<I, H> report, Instant time) {
|
||||||
String[] header = report.getColumnHeaders()
|
String[] header = report.getColumnHeaders()
|
||||||
.stream()
|
.stream()
|
||||||
.map(ColumnHeader::getDisplayName)
|
.map(H::getDisplayName)
|
||||||
.toArray(String[]::new);
|
.toArray(String[]::new);
|
||||||
ReportResource.MetaInformation meta = new ReportResource.MetaInformation(
|
ReportResource.MetaInformation meta = new ReportResource.MetaInformation(
|
||||||
report.getClass().getSimpleName(),
|
report.getClass().getSimpleName(),
|
||||||
|
|
|
||||||
|
|
@ -9,7 +9,7 @@ import org.springframework.hateoas.ResourceSupport;
|
||||||
import pro.taskana.impl.util.LoggerUtils;
|
import pro.taskana.impl.util.LoggerUtils;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Resource class for {@link pro.taskana.report.structure.Report}.
|
* Resource class for {@link pro.taskana.impl.report.structure.Report}.
|
||||||
*/
|
*/
|
||||||
public class ReportResource extends ResourceSupport {
|
public class ReportResource extends ResourceSupport {
|
||||||
|
|
||||||
|
|
@ -38,7 +38,7 @@ public class ReportResource extends ResourceSupport {
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Resource Interface for {@link pro.taskana.report.structure.Row}.
|
* Resource Interface for {@link pro.taskana.impl.report.structure.Row}.
|
||||||
*/
|
*/
|
||||||
public interface RowResource {
|
public interface RowResource {
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue