diff --git a/rest/pom.xml b/rest/pom.xml
index 21ff1fc2c..0fa2bd111 100644
--- a/rest/pom.xml
+++ b/rest/pom.xml
@@ -16,5 +16,6 @@
taskana-rest-spring
../web
taskana-rest-spring-example
+ taskana-history-rest-spring
diff --git a/rest/taskana-history-rest-spring/pom.xml b/rest/taskana-history-rest-spring/pom.xml
new file mode 100644
index 000000000..2b336df2e
--- /dev/null
+++ b/rest/taskana-history-rest-spring/pom.xml
@@ -0,0 +1,102 @@
+
+
+ 4.0.0
+
+ pro.taskana
+ taskana-history-rest-spring
+ 1.0.5-SNAPSHOT
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+
+ org.apache.maven.plugins
+ maven-javadoc-plugin
+ 2.9.1
+
+
+ attach-javadocs
+
+ jar
+
+
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-parent
+ 2.0.2.RELEASE
+
+
+
+
+
+ pro.taskana.simplehistory
+ taskana-simplehistory-provider
+ 0.0.6
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+ org.springframework.boot
+ spring-boot-starter-jdbc
+
+
+ org.springframework.plugin
+ spring-plugin-core
+
+
+ com.h2database
+ h2
+ 1.4.197
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ test
+
+
+ org.springframework.security
+ spring-security-test
+ test
+
+
+ org.springframework.restdocs
+ spring-restdocs-mockmvc
+ test
+
+
+ org.springframework.boot
+ spring-boot-starter-thymeleaf
+
+
+ org.springframework.hateoas
+ spring-hateoas
+ 0.24.0.RELEASE
+ compile
+
+
+ pro.taskana
+ taskana-spring
+ 1.0.5-SNAPSHOT
+ compile
+
+
+ pro.taskana
+ taskana-rest-spring
+ 1.0.5-SNAPSHOT
+ compile
+
+
+
\ No newline at end of file
diff --git a/rest/taskana-history-rest-spring/src/main/java/pro/taskana/rest/ExampleRestApplication.java b/rest/taskana-history-rest-spring/src/main/java/pro/taskana/rest/ExampleRestApplication.java
new file mode 100644
index 000000000..f1988e1e4
--- /dev/null
+++ b/rest/taskana-history-rest-spring/src/main/java/pro/taskana/rest/ExampleRestApplication.java
@@ -0,0 +1,72 @@
+package pro.taskana.rest;
+
+import java.sql.SQLException;
+
+import javax.annotation.PostConstruct;
+import javax.sql.DataSource;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.context.annotation.DependsOn;
+import org.springframework.context.annotation.Import;
+import org.springframework.context.annotation.Primary;
+import org.springframework.jdbc.datasource.DataSourceTransactionManager;
+import org.springframework.transaction.PlatformTransactionManager;
+
+import pro.taskana.rest.sampledata.SampleDataGenerator;
+
+/**
+ * Example Application showing the implementation of taskana-rest-spring.
+ */
+@SpringBootApplication
+@ComponentScan(basePackages = "pro.taskana")
+@Import({RestConfiguration.class})
+public class ExampleRestApplication {
+
+ @Value("${taskana.schemaName:TASKANA}")
+ public String schemaName;
+
+ @Autowired
+ private SampleDataGenerator sampleDataGenerator;
+
+ public static void main(String[] args) {
+ SpringApplication.run(ExampleRestApplication.class, args);
+ }
+
+ @Bean
+ @Primary
+ @ConfigurationProperties(prefix = "datasource")
+ public DataSourceProperties dataSourceProperties() {
+ DataSourceProperties props = new DataSourceProperties();
+ props.setUrl("jdbc:h2:mem:taskana;IGNORECASE=TRUE;LOCK_MODE=0;INIT=CREATE SCHEMA IF NOT EXISTS " + schemaName);
+ return props;
+ }
+
+ @Bean
+ public DataSource dataSource(DataSourceProperties properties) {
+ return properties.initializeDataSourceBuilder().build();
+ }
+
+ @Bean
+ public PlatformTransactionManager txManager(DataSource dataSource) {
+ return new DataSourceTransactionManager(dataSource);
+ }
+
+ @Bean
+ @DependsOn("getTaskanaEngine") // generate sample data after schema was inserted
+ public SampleDataGenerator generateSampleData(DataSource dataSource) throws SQLException {
+ sampleDataGenerator = new SampleDataGenerator(dataSource);
+ return sampleDataGenerator;
+ }
+
+ @PostConstruct
+ private void init() {
+ sampleDataGenerator.generateSampleData(schemaName);
+ }
+}
diff --git a/rest/taskana-history-rest-spring/src/main/java/pro/taskana/rest/TaskHistoryEventController.java b/rest/taskana-history-rest-spring/src/main/java/pro/taskana/rest/TaskHistoryEventController.java
new file mode 100644
index 000000000..66f02d2b1
--- /dev/null
+++ b/rest/taskana-history-rest-spring/src/main/java/pro/taskana/rest/TaskHistoryEventController.java
@@ -0,0 +1,386 @@
+package pro.taskana.rest;
+
+import java.time.Instant;
+import java.time.format.DateTimeFormatter;
+import java.util.List;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.hateoas.PagedResources;
+import org.springframework.hateoas.PagedResources.PageMetadata;
+import org.springframework.hateoas.config.EnableHypermediaSupport;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.MultiValueMap;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+import pro.taskana.BaseQuery;
+import pro.taskana.TimeInterval;
+import pro.taskana.configuration.TaskanaEngineConfiguration;
+import pro.taskana.exceptions.InvalidArgumentException;
+import pro.taskana.rest.resource.TaskHistoryEventResource;
+import pro.taskana.rest.resource.TaskHistoryEventListAssembler;
+import pro.taskana.simplehistory.impl.HistoryEventImpl;
+import pro.taskana.simplehistory.impl.SimpleHistoryServiceImpl;
+import pro.taskana.simplehistory.query.HistoryQuery;
+
+/**
+ * Controller for all TaskHistoryEvent related endpoints.
+ */
+@RestController
+@EnableHypermediaSupport(type = EnableHypermediaSupport.HypermediaType.HAL)
+@RequestMapping(path = "/v1/task-history-event", produces = "application/hal+json")
+public class TaskHistoryEventController extends AbstractPagingController {
+
+ private static final String LIKE = "%";
+ private static final String BUSINESS_PROCESS_ID = "business-process-id";
+ private static final String BUSINESS_PROCESS_ID_LIKE = "business-process-id-like";
+ private static final String PARENT_BUSINESS_PROCESS_ID = "parent-business-process-id";
+ private static final String PARENT_BUSINESS_PROCESS_ID_LIKE = "parent-business-process-id-like";
+ private static final String TASK_ID = "task-id";
+ private static final String TASK_ID_LIKE = "task-id-like";
+ private static final String EVENT_TYPE = "event-type";
+ private static final String EVENT_TYPE_LIKE = "event-type-like";
+ private static final String CREATED = "created";
+ private static final String USER_ID = "user-id";
+ private static final String USER_ID_LIKE = "user-id-like";
+ private static final String DOMAIN = "domain";
+ private static final String WORKBASKET_KEY = "workbasket-key";
+ private static final String WORKBASKET_KEY_LIKE = "workbasket-key-like";
+ private static final String POR_COMPANY = "por-company";
+ private static final String POR_COMPANY_LIKE = "por-company-like";
+ private static final String POR_SYSTEM = "por-system";
+ private static final String POR_SYSTEM_LIKE = "por-system-like";
+ private static final String POR_INSTANCE = "por-instance";
+ private static final String POR_INSTANCE_LIKE = "por-instance-like";
+ private static final String POR_TYPE = "por-type";
+ private static final String POR_TYPE_LIKE = "por-type-like";
+ private static final String POR_VALUE = "por-value";
+ private static final String POR_VALUE_LIKE = "por-value-like";
+ private static final String TASK_CLASSIFICATION_KEY = "task-classification-key";
+ private static final String TASK_CLASSIFICATION_KEY_LIKE = "task-classification-key-like";
+ private static final String TASK_CLASSIFICATION_CATEGORY = "task-classification-category";
+ private static final String TASK_CLASSIFICATION_CATEGORY_LIKE = "task-classification-category-like";
+ private static final String ATTACHMENT_CLASSIFICATION_KEY = "attachment-classification";
+ private static final String ATTACHMENT_CLASSIFICATION_KEY_LIKE = "attachment-classification-like";
+ private static final String CUSTOM_1 = "custom-1";
+ private static final String CUSTOM_1_LIKE = "custom-1-like";
+ private static final String CUSTOM_2 = "custom-2";
+ private static final String CUSTOM_2_LIKE = "custom-2-like";
+ private static final String CUSTOM_3 = "custom-3";
+ private static final String CUSTOM_3_LIKE = "custom-3-like";
+ private static final String CUSTOM_4 = "custom-4";
+ private static final String CUSTOM_4_LIKE = "custom-4-like";
+
+ private static final String SORT_BY = "sort-by";
+ private static final String SORT_DIRECTION = "order";
+
+ private static final String PAGING_PAGE = "page";
+ private static final String PAGING_PAGE_SIZE = "page-size";
+
+ private SimpleHistoryServiceImpl simpleHistoryService;
+
+ @Autowired
+ private TaskanaEngineConfiguration taskanaEngineConfiguration;
+
+ public TaskHistoryEventController(TaskanaEngineConfiguration taskanaEngineConfiguration) {
+ this.taskanaEngineConfiguration = taskanaEngineConfiguration;
+ simpleHistoryService = new SimpleHistoryServiceImpl();
+ simpleHistoryService.initialize(taskanaEngineConfiguration);
+ }
+
+ @GetMapping
+ @Transactional(readOnly = true, rollbackFor = Exception.class)
+ public ResponseEntity> getTaskHistoryEvent(
+ @RequestParam MultiValueMap params) throws InvalidArgumentException {
+
+ HistoryQuery query = simpleHistoryService.createHistoryQuery();
+ query = applySortingParams(query, params);
+ query = applyFilterParams(query, params);
+
+ PageMetadata pageMetadata = null;
+ List historyEvents = null;
+ String page = params.getFirst(PAGING_PAGE);
+ String pageSize = params.getFirst(PAGING_PAGE_SIZE);
+ params.remove(PAGING_PAGE);
+ params.remove(PAGING_PAGE_SIZE);
+ validateNoInvalidParameterIsLeft(params);
+ if (page != null && pageSize != null) {
+ long totalElements = query.count();
+ pageMetadata = initPageMetadata(pageSize, page, totalElements);
+ historyEvents = query.listPage((int) pageMetadata.getNumber(),
+ (int) pageMetadata.getSize());
+ } else if (page == null && pageSize == null) {
+ historyEvents = query.list();
+ } else {
+ throw new InvalidArgumentException("Paging information is incomplete.");
+ }
+
+ TaskHistoryEventListAssembler assembler = new TaskHistoryEventListAssembler();
+ PagedResources pagedResources = assembler.toResources(historyEvents, pageMetadata);
+
+ return new ResponseEntity<>(pagedResources, HttpStatus.OK);
+ }
+
+ private HistoryQuery applySortingParams(HistoryQuery query, MultiValueMap params)
+ throws IllegalArgumentException, InvalidArgumentException {
+ String sortBy = params.getFirst(SORT_BY);
+ if (sortBy != null) {
+ BaseQuery.SortDirection sortDirection;
+ if (params.getFirst(SORT_DIRECTION) != null && "desc".equals(params.getFirst(SORT_DIRECTION))) {
+ sortDirection = BaseQuery.SortDirection.DESCENDING;
+ } else {
+ sortDirection = BaseQuery.SortDirection.ASCENDING;
+ }
+ switch (sortBy) {
+ case (BUSINESS_PROCESS_ID):
+ query = query.orderByBusinessProcessId(sortDirection);
+ break;
+ case (PARENT_BUSINESS_PROCESS_ID):
+ query = query.orderByParentBusinessProcessId(sortDirection);
+ break;
+ case (TASK_ID):
+ query = query.orderByTaskId(sortDirection);
+ break;
+ case (EVENT_TYPE):
+ query = query.orderByEventType(sortDirection);
+ break;
+ case (CREATED):
+ query = query.orderByCreated(sortDirection);
+ break;
+ case (USER_ID):
+ query = query.orderByUserId(sortDirection);
+ break;
+ case (DOMAIN):
+ query = query.orderByDomain(sortDirection);
+ break;
+ case (WORKBASKET_KEY):
+ query = query.orderByWorkbasketKey(sortDirection);
+ break;
+ case (POR_COMPANY):
+ query = query.orderByPorCompany(sortDirection);
+ break;
+ case (POR_SYSTEM):
+ query = query.orderByPorSystem(sortDirection);
+ break;
+ case (POR_INSTANCE):
+ query = query.orderByPorInstance(sortDirection);
+ break;
+ case (POR_TYPE):
+ query = query.orderByPorType(sortDirection);
+ break;
+ case (POR_VALUE):
+ query = query.orderByPorValue(sortDirection);
+ break;
+ case (TASK_CLASSIFICATION_KEY):
+ query = query.orderByTaskClassificationKey(sortDirection);
+ break;
+ case (TASK_CLASSIFICATION_CATEGORY):
+ query = query.orderByTaskClassificationCategory(sortDirection);
+ break;
+ case (ATTACHMENT_CLASSIFICATION_KEY):
+ query = query.orderByAttachmentClassificationKey(sortDirection);
+ break;
+ case (CUSTOM_1):
+ query = query.orderByCustomAttribute(1, sortDirection);
+ break;
+ case (CUSTOM_2):
+ query = query.orderByCustomAttribute(2, sortDirection);
+ break;
+ case (CUSTOM_3):
+ query = query.orderByCustomAttribute(3, sortDirection);
+ break;
+ case (CUSTOM_4):
+ query = query.orderByCustomAttribute(4, sortDirection);
+ break;
+ default:
+ throw new IllegalArgumentException("Unknown order '" + sortBy + "'");
+ }
+ }
+ params.remove(SORT_BY);
+ params.remove(SORT_DIRECTION);
+ return query;
+ }
+
+ private HistoryQuery applyFilterParams(HistoryQuery query,
+ MultiValueMap params) {
+ if (params.containsKey(BUSINESS_PROCESS_ID)) {
+ String[] businessProcessId = extractCommaSeparatedFields(params.get(BUSINESS_PROCESS_ID));
+ query.businessProcessIdIn(businessProcessId);
+ params.remove(BUSINESS_PROCESS_ID);
+ }
+ if (params.containsKey(BUSINESS_PROCESS_ID_LIKE)) {
+ query.businessProcessIdLike(LIKE + params.get(BUSINESS_PROCESS_ID_LIKE).get(0) + LIKE);
+ params.remove(BUSINESS_PROCESS_ID_LIKE);
+ }
+ if (params.containsKey(PARENT_BUSINESS_PROCESS_ID)) {
+ String[] parentBusinessProcessId = extractCommaSeparatedFields(params.get(PARENT_BUSINESS_PROCESS_ID));
+ query.parentBusinessProcessIdIn(parentBusinessProcessId);
+ params.remove(PARENT_BUSINESS_PROCESS_ID);
+ }
+ if (params.containsKey(PARENT_BUSINESS_PROCESS_ID_LIKE)) {
+ query.parentBusinessProcessIdLike(LIKE + params.get(PARENT_BUSINESS_PROCESS_ID_LIKE).get(0) + LIKE);
+ params.remove(PARENT_BUSINESS_PROCESS_ID_LIKE);
+ }
+ if (params.containsKey(TASK_ID)) {
+ String[] taskId = extractCommaSeparatedFields(params.get(TASK_ID));
+ query.taskIdIn(taskId);
+ params.remove(TASK_ID);
+ }
+ if (params.containsKey(TASK_ID_LIKE)) {
+ query.taskIdLike(LIKE + params.get(TASK_ID_LIKE).get(0) + LIKE);
+ params.remove(TASK_ID_LIKE);
+ }
+ if (params.containsKey(EVENT_TYPE)) {
+ String[] eventType = extractCommaSeparatedFields(params.get(EVENT_TYPE));
+ query.eventTypeIn(eventType);
+ params.remove(EVENT_TYPE);
+ }
+ if (params.containsKey(EVENT_TYPE_LIKE)) {
+ query.eventTypeLike(LIKE + params.get(EVENT_TYPE_LIKE).get(0) + LIKE);
+ params.remove(EVENT_TYPE_LIKE);
+ }
+ if (params.containsKey(CREATED)) {
+ String[] created = extractCommaSeparatedFields(params.get(CREATED));
+ DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
+ Instant date = Instant.from(formatter.parse(created[0]));
+ TimeInterval timeInterval = new TimeInterval(date, date);
+ query.createdWithin(timeInterval);
+ params.remove(CREATED);
+ }
+ if (params.containsKey(USER_ID)) {
+ String[] userId = extractCommaSeparatedFields(params.get(USER_ID));
+ query.userIdIn(userId);
+ params.remove(USER_ID);
+ }
+ if (params.containsKey(USER_ID_LIKE)) {
+ query.userIdLike(LIKE + params.get(USER_ID_LIKE).get(0) + LIKE);
+ params.remove(USER_ID_LIKE);
+ }
+ if (params.containsKey(DOMAIN)) {
+ query.domainIn(extractCommaSeparatedFields(params.get(DOMAIN)));
+ params.remove(DOMAIN);
+ }
+ if (params.containsKey(WORKBASKET_KEY)) {
+ String[] workbasketKey = extractCommaSeparatedFields(params.get(WORKBASKET_KEY));
+ query.workbasketKeyIn(workbasketKey);
+ params.remove(WORKBASKET_KEY);
+ }
+ if (params.containsKey(WORKBASKET_KEY_LIKE)) {
+ query.workbasketKeyLike(LIKE + params.get(WORKBASKET_KEY_LIKE).get(0) + LIKE);
+ params.remove(WORKBASKET_KEY_LIKE);
+ }
+ if (params.containsKey(POR_COMPANY)) {
+ String[] porCompany = extractCommaSeparatedFields(params.get(POR_COMPANY));
+ query.porCompanyIn(porCompany);
+ params.remove(POR_COMPANY);
+ }
+ if (params.containsKey(POR_COMPANY_LIKE)) {
+ query.porCompanyLike(LIKE + params.get(POR_COMPANY_LIKE).get(0) + LIKE);
+ params.remove(POR_COMPANY_LIKE);
+ }
+ if (params.containsKey(POR_SYSTEM)) {
+ String[] porSystem = extractCommaSeparatedFields(params.get(POR_SYSTEM));
+ query.porSystemIn(porSystem);
+ params.remove(POR_SYSTEM);
+ }
+ if (params.containsKey(POR_SYSTEM_LIKE)) {
+ query.porSystemLike(LIKE + params.get(POR_SYSTEM_LIKE).get(0) + LIKE);
+ params.remove(POR_SYSTEM_LIKE);
+ }
+ if (params.containsKey(POR_INSTANCE)) {
+ String[] porInstance = extractCommaSeparatedFields(params.get(POR_INSTANCE));
+ query.porInstanceIn(porInstance);
+ params.remove(POR_INSTANCE);
+ }
+ if (params.containsKey(POR_INSTANCE_LIKE)) {
+ query.porInstanceLike(LIKE + params.get(POR_INSTANCE_LIKE).get(0) + LIKE);
+ params.remove(POR_INSTANCE_LIKE);
+ }
+ if (params.containsKey(POR_TYPE)) {
+ String[] porType = extractCommaSeparatedFields(params.get(POR_TYPE));
+ query.porTypeIn(porType);
+ params.remove(POR_TYPE);
+ }
+ if (params.containsKey(POR_TYPE_LIKE)) {
+ query.porTypeLike(LIKE + params.get(POR_TYPE_LIKE).get(0) + LIKE);
+ params.remove(POR_TYPE_LIKE);
+ }
+ if (params.containsKey(POR_VALUE)) {
+ String[] porValue = extractCommaSeparatedFields(params.get(POR_VALUE));
+ query.porValueIn(porValue);
+ params.remove(POR_VALUE);
+ }
+ if (params.containsKey(POR_VALUE_LIKE)) {
+ query.porValueLike(LIKE + params.get(POR_VALUE_LIKE).get(0) + LIKE);
+ params.remove(POR_VALUE_LIKE);
+ }
+ if (params.containsKey(TASK_CLASSIFICATION_KEY)) {
+ String[] taskClassificationKey = extractCommaSeparatedFields(params.get(TASK_CLASSIFICATION_KEY));
+ query.taskClassificationKeyIn(taskClassificationKey);
+ params.remove(TASK_CLASSIFICATION_KEY);
+ }
+ if (params.containsKey(TASK_CLASSIFICATION_KEY_LIKE)) {
+ query.taskClassificationKeyLike(LIKE + params.get(TASK_CLASSIFICATION_KEY_LIKE).get(0) + LIKE);
+ params.remove(TASK_CLASSIFICATION_KEY_LIKE);
+ }
+ if (params.containsKey(TASK_CLASSIFICATION_CATEGORY)) {
+ String[] taskClassificationCategory = extractCommaSeparatedFields(params.get(TASK_CLASSIFICATION_CATEGORY));
+ query.taskClassificationCategoryIn(taskClassificationCategory);
+ params.remove(TASK_CLASSIFICATION_CATEGORY);
+ }
+ if (params.containsKey(TASK_CLASSIFICATION_CATEGORY_LIKE)) {
+ query.taskClassificationCategoryLike(LIKE + params.get(TASK_CLASSIFICATION_CATEGORY_LIKE).get(0) + LIKE);
+ params.remove(TASK_CLASSIFICATION_CATEGORY_LIKE);
+ }
+ if (params.containsKey(ATTACHMENT_CLASSIFICATION_KEY)) {
+ String[] attachmentClassificationKey = extractCommaSeparatedFields(params.get(ATTACHMENT_CLASSIFICATION_KEY));
+ query.attachmentClassificationKeyIn(attachmentClassificationKey);
+ params.remove(ATTACHMENT_CLASSIFICATION_KEY);
+ }
+ if (params.containsKey(ATTACHMENT_CLASSIFICATION_KEY_LIKE)) {
+ query.attachmentClassificationKeyLike(LIKE + params.get(ATTACHMENT_CLASSIFICATION_KEY_LIKE).get(0) + LIKE);
+ params.remove(ATTACHMENT_CLASSIFICATION_KEY_LIKE);
+ }
+ if (params.containsKey(CUSTOM_1)) {
+ String[] custom1 = extractCommaSeparatedFields(params.get(CUSTOM_1));
+ query.custom1In(custom1);
+ params.remove(CUSTOM_1);
+ }
+ if (params.containsKey(CUSTOM_1_LIKE)) {
+ query.custom1Like(LIKE + params.get(CUSTOM_1_LIKE).get(0) + LIKE);
+ params.remove(CUSTOM_1_LIKE);
+ }
+ if (params.containsKey(CUSTOM_2)) {
+ String[] custom2 = extractCommaSeparatedFields(params.get(CUSTOM_2));
+ query.custom2In(custom2);
+ params.remove(CUSTOM_2);
+ }
+ if (params.containsKey(CUSTOM_2_LIKE)) {
+ query.custom2Like(LIKE + params.get(CUSTOM_2_LIKE).get(0) + LIKE);
+ params.remove(CUSTOM_2_LIKE);
+ }
+ if (params.containsKey(CUSTOM_3)) {
+ String[] custom3 = extractCommaSeparatedFields(params.get(CUSTOM_3));
+ query.custom3In(custom3);
+ params.remove(CUSTOM_3);
+ }
+ if (params.containsKey(CUSTOM_3_LIKE)) {
+ query.custom3Like(LIKE + params.get(CUSTOM_3_LIKE).get(0) + LIKE);
+ params.remove(CUSTOM_3_LIKE);
+ }
+ if (params.containsKey(CUSTOM_4)) {
+ String[] custom4 = extractCommaSeparatedFields(params.get(CUSTOM_4));
+ query.custom4In(custom4);
+ params.remove(CUSTOM_4);
+ }
+ if (params.containsKey(CUSTOM_4_LIKE)) {
+ query.custom4Like(LIKE + params.get(CUSTOM_4_LIKE).get(0) + LIKE);
+ params.remove(CUSTOM_4_LIKE);
+ }
+ return query;
+ }
+}
diff --git a/rest/taskana-history-rest-spring/src/main/java/pro/taskana/rest/resource/TaskHistoryEventAssembler.java b/rest/taskana-history-rest-spring/src/main/java/pro/taskana/rest/resource/TaskHistoryEventAssembler.java
new file mode 100644
index 000000000..ff9729fff
--- /dev/null
+++ b/rest/taskana-history-rest-spring/src/main/java/pro/taskana/rest/resource/TaskHistoryEventAssembler.java
@@ -0,0 +1,29 @@
+package pro.taskana.rest.resource;
+
+import org.springframework.beans.BeanUtils;
+import org.springframework.hateoas.mvc.ResourceAssemblerSupport;
+
+import pro.taskana.history.api.TaskanaHistoryEvent;
+import pro.taskana.simplehistory.impl.HistoryEventImpl;
+
+/**
+ * Transforms any {@link HistoryEventImpl} into its {@link TaskHistoryEventResource}.
+ */
+public class TaskHistoryEventAssembler extends ResourceAssemblerSupport {
+
+ public TaskHistoryEventAssembler() {
+ super(HistoryEventImpl.class, TaskHistoryEventResource.class);
+ }
+
+ @Override
+ public TaskHistoryEventResource toResource(TaskanaHistoryEvent historyEvent) {
+ TaskHistoryEventResource resource = createResourceWithId(historyEvent.getId(), historyEvent);
+ BeanUtils.copyProperties(historyEvent, resource);
+ if (historyEvent.getCreated() != null) {
+ resource.setCreated(historyEvent.getCreated().toString());
+ }
+ resource.setTaskHistoryId(String.valueOf(historyEvent.getId()));
+ resource.removeLinks();
+ return resource;
+ }
+}
diff --git a/rest/taskana-history-rest-spring/src/main/java/pro/taskana/rest/resource/TaskHistoryEventListAssembler.java b/rest/taskana-history-rest-spring/src/main/java/pro/taskana/rest/resource/TaskHistoryEventListAssembler.java
new file mode 100644
index 000000000..9773c00f1
--- /dev/null
+++ b/rest/taskana-history-rest-spring/src/main/java/pro/taskana/rest/resource/TaskHistoryEventListAssembler.java
@@ -0,0 +1,53 @@
+package pro.taskana.rest.resource;
+
+import static org.springframework.hateoas.mvc.ControllerLinkBuilder.linkTo;
+import static pro.taskana.rest.resource.AbstractRessourcesAssembler.getBuilderForOriginalUri;
+
+import java.util.List;
+
+import org.springframework.hateoas.Link;
+import org.springframework.hateoas.PagedResources;
+import org.springframework.web.util.UriComponentsBuilder;
+
+import pro.taskana.rest.TaskHistoryEventController;
+import pro.taskana.simplehistory.impl.HistoryEventImpl;
+
+/**
+ * Mapper to convert from a list of HistoryEventImpl to a TaskHistoryEventResource.
+ */
+public class TaskHistoryEventListAssembler {
+
+ public TaskHistoryEventListAssembler() {
+ }
+
+ public PagedResources toResources(List historyEvents,
+ PagedResources.PageMetadata pageMetadata) {
+
+ TaskHistoryEventAssembler assembler = new TaskHistoryEventAssembler();
+ List resources = assembler.toResources(historyEvents);
+ PagedResources pagedResources = new PagedResources(
+ resources,
+ pageMetadata);
+
+ UriComponentsBuilder original = getBuilderForOriginalUri();
+ pagedResources.add(new Link(original.toUriString()).withSelfRel());
+ if (pageMetadata != null) {
+ pagedResources.add(linkTo(TaskHistoryEventController.class).withRel("allTaskHistoryEvent"));
+ pagedResources.add(new Link(original.replaceQueryParam("page", 1).toUriString()).withRel(Link.REL_FIRST));
+ pagedResources.add(new Link(original.replaceQueryParam("page", pageMetadata.getTotalPages()).toUriString())
+ .withRel(Link.REL_LAST));
+ if (pageMetadata.getNumber() > 1) {
+ pagedResources
+ .add(new Link(original.replaceQueryParam("page", pageMetadata.getNumber() - 1).toUriString())
+ .withRel(Link.REL_PREVIOUS));
+ }
+ if (pageMetadata.getNumber() < pageMetadata.getTotalPages()) {
+ pagedResources
+ .add(new Link(original.replaceQueryParam("page", pageMetadata.getNumber() + 1).toUriString())
+ .withRel(Link.REL_NEXT));
+ }
+ }
+
+ return pagedResources;
+ }
+}
diff --git a/rest/taskana-history-rest-spring/src/main/java/pro/taskana/rest/resource/TaskHistoryEventResource.java b/rest/taskana-history-rest-spring/src/main/java/pro/taskana/rest/resource/TaskHistoryEventResource.java
new file mode 100644
index 000000000..7ea56b78f
--- /dev/null
+++ b/rest/taskana-history-rest-spring/src/main/java/pro/taskana/rest/resource/TaskHistoryEventResource.java
@@ -0,0 +1,247 @@
+package pro.taskana.rest.resource;
+
+import org.springframework.hateoas.ResourceSupport;
+
+import javax.validation.constraints.NotNull;
+
+/**
+ * Resource class for {@link pro.taskana.history.api.TaskanaHistoryEvent}.
+ */
+public class TaskHistoryEventResource extends ResourceSupport {
+ @NotNull
+ private String taskHistoryEventId;
+
+ private String businessProcessId;
+ private String parentBusinessProcessId;
+ private String taskId;
+ private String eventType;
+ private String created;
+ private String userId;
+ private String domain;
+ private String workbasketKey;
+ private String porCompany;
+ private String porType;
+ private String porSystem;
+ private String porInstance;
+ private String porValue;
+ private String taskClassificationKey;
+ private String taskClassificationCategory;
+ private String attachmentClassificationKey;
+ private String comment;
+ private String oldValue;
+ private String newValue;
+ private String custom1;
+ private String custom2;
+ private String custom3;
+ private String custom4;
+ private String oldData;
+ private String newData;
+
+ public String getTaskHistoryId() {
+ return taskHistoryEventId;
+ }
+
+ public void setTaskHistoryId(String taskHistoryId) {
+ this.taskHistoryEventId = taskHistoryId;
+ }
+
+ public String getBusinessProcessId() {
+ return businessProcessId;
+ }
+
+ public void setBusinessProcessId(String businessProcessId) {
+ this.businessProcessId = businessProcessId;
+ }
+
+ public String getParentBusinessProcessId() {
+ return parentBusinessProcessId;
+ }
+
+ public void setParentBusinessProcessId(String parentBusinessProcessId) {
+ this.parentBusinessProcessId = parentBusinessProcessId;
+ }
+
+ public String getTaskId() {
+ return taskId;
+ }
+
+ public void setTaskId(String taskId) {
+ this.taskId = taskId;
+ }
+
+ public String getEventType() {
+ return eventType;
+ }
+
+ public void setEventType(String eventType) {
+ this.eventType = eventType;
+ }
+
+ public String getCreated() {
+ return created;
+ }
+
+ public void setCreated(String created) {
+ this.created = created;
+ }
+
+ public String getUserId() {
+ return userId;
+ }
+
+ public void setUserId(String userId) {
+ this.userId = userId;
+ }
+
+ public String getDomain() {
+ return domain;
+ }
+
+ public void setDomain(String domain) {
+ this.domain = domain;
+ }
+
+ public String getWorkbasketKey() {
+ return workbasketKey;
+ }
+
+ public void setWorkbasketKey(String workbasketKey) {
+ this.workbasketKey = workbasketKey;
+ }
+
+ public String getPorCompany() {
+ return porCompany;
+ }
+
+ public void setPorCompany(String porCompany) {
+ this.porCompany = porCompany;
+ }
+
+ public String getPorType() {
+ return porType;
+ }
+
+ public void setPorType(String porType) {
+ this.porType = porType;
+ }
+
+ public String getPorSystem() {
+ return porSystem;
+ }
+
+ public void setPorSystem(String porSystem) {
+ this.porSystem = porSystem;
+ }
+
+ public String getPorInstance() {
+ return porInstance;
+ }
+
+ public void setPorInstance(String porInstance) {
+ this.porInstance = porInstance;
+ }
+
+ public String getPorValue() {
+ return porValue;
+ }
+
+ public void setPorValue(String porValue) {
+ this.porValue = porValue;
+ }
+
+ public String getTaskClassificationKey() {
+ return taskClassificationKey;
+ }
+
+ public void setTaskClassificationKey(String taskClassificationKey) {
+ this.taskClassificationKey = taskClassificationKey;
+ }
+
+ public String getTaskClassificationCategory() {
+ return taskClassificationCategory;
+ }
+
+ public void setTaskClassificationCategory(String taskClassificationCategory) {
+ this.taskClassificationCategory = taskClassificationCategory;
+ }
+
+ public String getAttachmentClassificationKey() {
+ return attachmentClassificationKey;
+ }
+
+ public void setAttachmentClassificationKey(String attachmentClassificationKey) {
+ this.attachmentClassificationKey = attachmentClassificationKey;
+ }
+
+ public String getComment() {
+ return comment;
+ }
+
+ public void setComment(String comment) {
+ this.comment = comment;
+ }
+
+ public String getOldValue() {
+ return oldValue;
+ }
+
+ public void setOldValue(String oldValue) {
+ this.oldValue = oldValue;
+ }
+
+ public String getNewValue() {
+ return newValue;
+ }
+
+ public void setNewValue(String newValue) {
+ this.newValue = newValue;
+ }
+
+ public String getCustom1() {
+ return custom1;
+ }
+
+ public void setCustom1(String custom1) {
+ this.custom1 = custom1;
+ }
+
+ public String getCustom2() {
+ return custom2;
+ }
+
+ public void setCustom2(String custom2) {
+ this.custom2 = custom2;
+ }
+
+ public String getCustom3() {
+ return custom3;
+ }
+
+ public void setCustom3(String custom3) {
+ this.custom3 = custom3;
+ }
+
+ public String getCustom4() {
+ return custom4;
+ }
+
+ public void setCustom4(String custom4) {
+ this.custom4 = custom4;
+ }
+
+ public String getOldData() {
+ return oldData;
+ }
+
+ public void setOldData(String oldData) {
+ this.oldData = oldData;
+ }
+
+ public String getNewData() {
+ return newData;
+ }
+
+ public void setNewData(String newData) {
+ this.newData = newData;
+ }
+}
diff --git a/rest/taskana-history-rest-spring/src/main/java/pro/taskana/rest/sampledata/SampleDataGenerator.java b/rest/taskana-history-rest-spring/src/main/java/pro/taskana/rest/sampledata/SampleDataGenerator.java
new file mode 100644
index 000000000..a8443faca
--- /dev/null
+++ b/rest/taskana-history-rest-spring/src/main/java/pro/taskana/rest/sampledata/SampleDataGenerator.java
@@ -0,0 +1,77 @@
+package pro.taskana.rest.sampledata;
+
+import java.io.BufferedReader;
+import java.io.InputStreamReader;
+import java.io.PrintWriter;
+import java.io.StringReader;
+import java.io.StringWriter;
+import java.nio.charset.StandardCharsets;
+import java.sql.SQLException;
+
+import javax.sql.DataSource;
+
+import org.apache.ibatis.jdbc.ScriptRunner;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * This class generates sample data for manual testing purposes.
+ */
+public class SampleDataGenerator {
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(SampleDataGenerator.class);
+ private static final String SQL = "/sql";
+ private static final String TEST_DATA = "/sql.sample-data";
+ private static final String CLEAR = TEST_DATA + "/clear-db.sql";
+ private static final String HISTORY_EVENT = TEST_DATA + "/history-event.sql";
+ private ScriptRunner runner;
+
+
+ DataSource dataSource;
+
+ public SampleDataGenerator(DataSource dataSource) throws SQLException {
+ if (LOGGER.isTraceEnabled()) {
+ LOGGER.trace(dataSource.getConnection().getMetaData().toString());
+ }
+ this.dataSource = dataSource;
+
+ runner = new ScriptRunner(dataSource.getConnection());
+ }
+
+ public void generateSampleData(String schemaName) {
+ StringWriter outWriter = new StringWriter();
+ PrintWriter logWriter = new PrintWriter(outWriter);
+
+ StringWriter errorWriter = new StringWriter();
+ PrintWriter errorLogWriter = new PrintWriter(errorWriter);
+ try {
+ runner.runScript(selectSchemaScript(dataSource.getConnection().getMetaData().getDatabaseProductName(), schemaName));
+ runner.setStopOnError(false);
+ runner.runScript(new BufferedReader(
+ new InputStreamReader(this.getClass().getResourceAsStream(CLEAR), StandardCharsets.UTF_8)));
+ } catch (Exception e) {
+ LOGGER.error("caught Exception {}", e);
+ }
+
+ runner.setStopOnError(true);
+ runner.setLogWriter(logWriter);
+ runner.setErrorLogWriter(errorLogWriter);
+
+ runner.runScript(new BufferedReader(
+ new InputStreamReader(this.getClass().getResourceAsStream(HISTORY_EVENT), StandardCharsets.UTF_8)));
+
+ runner.closeConnection();
+
+ LOGGER.trace(outWriter.toString());
+ if (!errorWriter.toString().trim().isEmpty()) {
+ LOGGER.error(errorWriter.toString());
+ }
+ }
+
+ private StringReader selectSchemaScript(String dbProductName, String schemaName) {
+ return new StringReader("PostgreSQL".equals(dbProductName) ?
+ "SET search_path TO " + schemaName + ";" :
+ "SET SCHEMA " + schemaName + ";");
+ }
+
+}
diff --git a/rest/taskana-history-rest-spring/src/main/resources/application.properties b/rest/taskana-history-rest-spring/src/main/resources/application.properties
new file mode 100644
index 000000000..c98e26959
--- /dev/null
+++ b/rest/taskana-history-rest-spring/src/main/resources/application.properties
@@ -0,0 +1,2 @@
+logging.level.pro.taskana=INFO
+taskana.schemaName=TASKANA
diff --git a/rest/taskana-history-rest-spring/src/main/resources/sql.sample-data/clear-db.sql b/rest/taskana-history-rest-spring/src/main/resources/sql.sample-data/clear-db.sql
new file mode 100644
index 000000000..c17015f2e
--- /dev/null
+++ b/rest/taskana-history-rest-spring/src/main/resources/sql.sample-data/clear-db.sql
@@ -0,0 +1,3 @@
+-- the order is important!
+DELETE FROM HISTORY_EVENT;
+COMMIT;
diff --git a/rest/taskana-history-rest-spring/src/main/resources/sql.sample-data/drop-tables.sql b/rest/taskana-history-rest-spring/src/main/resources/sql.sample-data/drop-tables.sql
new file mode 100644
index 000000000..dea96aed9
--- /dev/null
+++ b/rest/taskana-history-rest-spring/src/main/resources/sql.sample-data/drop-tables.sql
@@ -0,0 +1,4 @@
+DROP TABLE TASKANA_SCHEMA_VERSION;
+DROP TABLE HISTORY_EVENT;
+
+COMMIT;
diff --git a/rest/taskana-history-rest-spring/src/main/resources/sql.sample-data/history-event.sql b/rest/taskana-history-rest-spring/src/main/resources/sql.sample-data/history-event.sql
new file mode 100644
index 000000000..69aea8717
--- /dev/null
+++ b/rest/taskana-history-rest-spring/src/main/resources/sql.sample-data/history-event.sql
@@ -0,0 +1,54 @@
+SET SCHEMA TASKANA;
+
+INSERT INTO HISTORY_EVENTS (BUSINESS_PROCESS_ID, PARENT_BUSINESS_PROCESS_ID, TASK_ID, EVENT_TYPE, CREATED, USER_ID, DOMAIN, WORKBASKET_KEY, POR_COMPANY, POR_SYSTEM, POR_INSTANCE, POR_TYPE, POR_VALUE, TASK_CLASSIFICATION_KEY, TASK_CLASSIFICATION_CATEGORY, ATTACHMENT_CLASSIFICATION_KEY, COMMENT, OLD_VALUE, NEW_VALUE, CUSTOM_1, CUSTOM_2, CUSTOM_3, CUSTOM_4, OLD_DATA, NEW_DATA) VALUES
+-- BUSINESS_PROCESS_ID, PARENT_BUSINESS_PROCESS_ID, TASK_ID, EVENT_TYPE, CREATED, USER_ID, DOMAIN, WORKBASKET_KEY, POR_COMPANY , POR_SYSTEM, POR_INSTANCE , POR_TYPE , POR_VALUE , TASK_CLASSIFICATION_KEY, TASK_CLASSIFICATION_CATEGORY , ATTACHMENT_CLASSIFICATION_KEY , COMMENT , OLD_VALUE , NEW_VALUE , CUSTOM_1 , CUSTOM_2 , CUSTOM_3 , CUSTOM_4 , OLD_DATA , NEW_DATA
+(1, 'BPI:01' ,'', 'TKI:000000000000000000000000000000000000', 'CREATE', CURRENT_TIMESTAMP, 'USER_2_2', 'DOMAIN_B', 'WBI:100000000000000000000000000000000001', '00' , 'PASystem', '00' , 'VNR' , '11223344', 'L140101' , 'TASK' ,'' , 'this task has been created' ,'old_val' ,'new_val' ,'custom1' ,'custom2' , 'custom3' ,'custom4' ,'123' ,'456'),
+(2, 'BPI:02' ,'', 'TKI:000000000000000000000000000000000000', 'UPDATE', DATEADD('DAY', -2, CURRENT_TIMESTAMP), 'USER_1_1', 'DOMAIN_A', 'WBI:100000000000000000000000000000000001', '00' , 'PASystem', '00' , 'VNR' , '65464564', '' , '' ,'' , 'created by Peter' ,'2old_val' ,'new_val2' ,'custom1' ,'' , 'custom2' ,'' ,'234' ,'777'),
+(3, 'BPI:03' ,'BPI:01', 'TKI:000000000000000000000000000000000001', 'DELETE', CURRENT_TIMESTAMP, 'USER_2_1', 'DOMAIN_B', 'WBI:100000000000000000000000000000000002', '11' , '' , '22' , '' , '' , 'L140101' , 'TASK' ,'DOCTYPE_DEFAULT' , 'created a bug' ,'' ,'' ,'custom1' ,'' , 'custom3' ,'' ,'119' ,'555'),
+(4, 'BPI:04' ,'' , 'TKI:000000000000000000000000000000000000', 'UPDATE', DATEADD('DAY', -1, CURRENT_TIMESTAMP), 'USER_1_2', 'DOMAIN_B', 'WBI:100000000000000000000000000000000001', '00' , 'PASystem', '00' , 'VNR' , '11223344', '' , '' ,'' , 'created by Peter' ,'2old_val' ,'new_val2' ,'custom1' ,'' , 'custom2' ,'' ,'234' ,'999'),
+(5, 'BPI:03' ,'BPI:02', 'TKI:000000000000000000000000000000000001', 'DELETE', CURRENT_TIMESTAMP, 'USER_2_1', 'DOMAIN_A', 'WBI:100000000000000000000000000000000002', '11' , '' , '22' , '' , '' , 'L140101' , 'TASK' ,'DOCTYPE_DEFAULT' , 'created a bug' ,'' ,'' ,'custom1' ,'' , 'custom3' ,'' ,'1188' ,'QQQ'),
+(6, 'BPI:02' ,'' , 'TKI:000000000000000000000000000000000000', 'CREATE', DATEADD('DAY', -6, CURRENT_TIMESTAMP), 'USER_2_2', 'DOMAIN_A', 'WBI:100000000000000000000000000000000001', '00' , 'PASystem', '00' , 'VNR' , '11223344', '' , '' ,'' , 'created by Peter' ,'2old_val' ,'new_val2' ,'custom1' ,'' , 'custom2' ,'' ,'234' ,'eee'),
+(7, 'BPI:06' ,'BPI:04', 'TKI:000000000000000000000000000000000001', 'UPDATE', CURRENT_TIMESTAMP, 'USER_2_1', 'DOMAIN_B', 'WBI:100000000000000000000000000000000002', '11' , '' , '22' , '' , '' , 'L140101' , 'TASK' ,'DOCTYPE_DEFAULT' , 'created a bug' ,'' ,'' ,'custom1' ,'' , 'custom3' ,'' ,'ZZZ' ,'777'),
+(8, 'BPI:02' ,'' , 'TKI:000000000000000000000000000000000000', 'DELETE', DATEADD('DAY', -5, CURRENT_TIMESTAMP), 'USER_2_1', 'DOMAIN_B', 'WBI:100000000000000000000000000000000001', '00' , 'PASystem', '00' , 'VNR' , '11223344', '' , '' ,'' , 'created by Peter' ,'2old_val' ,'new_val2' ,'custom1' ,'' , 'custom2' ,'' ,'234' ,'999'),
+(9, 'BPI:04' ,'BPI:03', 'TKI:000000000000000000000000000000000001', 'CREATE', CURRENT_TIMESTAMP, 'USER_2_1', 'DOMAIN_B', 'WBI:100000000000000000000000000000000002', '11' , '' , '22' , '' , '' , 'L140101' , 'TASK' ,'DOCTYPE_DEFAULT' , 'created a bug' ,'' ,'' ,'custom1' ,'' , 'custom3' ,'' ,'288' ,'ooo'),
+(10, 'BPI:02' ,'' , 'TKI:000000000000000000000000000000000000', 'UPDATE', DATEADD('DAY', -1, CURRENT_TIMESTAMP), 'USER_1_1', 'DOMAIN_A', 'WBI:100000000000000000000000000000000001', '00' , 'PASystem', '00' , 'VNR' , '65464564', '' , '' ,'' , 'created by Peter' ,'2old_val' ,'new_val2' ,'custom1' ,'' , 'custom2' ,'' ,'234' ,'SSS'),
+(11, 'BPI:04' ,'BPI:01', 'TKI:000000000000000000000000000000000001', 'DELETE', CURRENT_TIMESTAMP, 'USER_2_1', 'DOMAIN_A', 'WBI:100000000000000000000000000000000002', '11' , '' , '22' , '' , '' , 'L140101' , 'TASK' ,'DOCTYPE_DEFAULT' , 'created a bug' ,'' ,'' ,'custom1' ,'' , 'custom3' ,'' ,'DDD' ,'555'),
+(12, 'BPI:02' ,'' , 'TKI:000000000000000000000000000000000000', 'CREATE', DATEADD('DAY', -2, CURRENT_TIMESTAMP), 'USER_1_2', 'DOMAIN_A', 'WBI:100000000000000000000000000000000001', '00' , 'PASystem', '00' , 'VNR' , '68887564', '' , '' ,'' , 'created by Peter' ,'2old_val' ,'new_val2' ,'custom1' ,'' , 'custom2' ,'' ,'234' ,'555'),
+(13, 'BPI:03' ,'BPI:05', 'TKI:000000000000000000000000000000000001', 'UPDATE', CURRENT_TIMESTAMP, 'USER_2_1', 'DOMAIN_A', 'WBI:100000000000000000000000000000000002', '11' , '' , '22' , '' , '' , 'L140101' , 'TASK' ,'DOCTYPE_DEFAULT' , 'created a bug' ,'' ,'' ,'custom1' ,'' , 'custom3' ,'' ,'123' ,'777'),
+(14, 'BPI:02' ,'' , 'TKI:000000000000000000000000000000000000', 'DELETE', DATEADD('DAY', -5, CURRENT_TIMESTAMP), 'USER_2_2', 'DOMAIN_A', 'WBI:100000000000000000000000000000000001', '00' , 'PASystem', '00' , 'VNR' , '68887564', '' , '' ,'' , 'created by Peter' ,'2old_val' ,'new_val2' ,'custom1' ,'' , 'custom2' ,'' ,'234' ,'456'),
+(15, 'BPI:03' ,'BPI:07', 'TKI:000000000000000000000000000000000001', 'CREATE', CURRENT_TIMESTAMP, 'USER_2_1', 'DOMAIN_A', 'WBI:100000000000000000000000000000000002', '11' , '' , '22' , '' , '' , 'L140101' , 'TASK' ,'DOCTYPE_DEFAULT' , 'created a bug' ,'' ,'' ,'custom1' ,'' , 'custom3' ,'' ,'288' ,'ooo'),
+(16, 'BPI:02' ,'' , 'TKI:000000000000000000000000000000000000', 'UPDATE', DATEADD('DAY', -1, CURRENT_TIMESTAMP), 'USER_2_1', 'DOMAIN_B', 'WBI:100000000000000000000000000000000001', '00' , 'PASystem', '00' , 'VNR' , '11223344', '' , '' ,'' , 'created by Peter' ,'2old_val' ,'new_val2' ,'custom1' ,'' , 'custom2' ,'' ,'234' ,'456'),
+(17, 'BPI:03' ,'BPI:07', 'TKI:000000000000000000000000000000000001', 'DELETE', CURRENT_TIMESTAMP, 'USER_2_1', 'DOMAIN_B', 'WBI:100000000000000000000000000000000002', '11' , '' , '22' , '' , '' , 'L140101' , 'TASK' ,'DOCTYPE_DEFAULT' , 'created a bug' ,'' ,'' ,'custom1' ,'' , 'custom3' ,'' ,'PPP' ,'777'),
+(18, 'BPI:02' ,'' , 'TKI:000000000000000000000000000000000000', 'CREATE', DATEADD('DAY', -5, CURRENT_TIMESTAMP), 'USER_1_1', 'DOMAIN_A', 'WBI:100000000000000000000000000000000001', '00' , 'PASystem', '00' , 'VNR' , '11223344', '' , '' ,'' , 'created by Peter' ,'2old_val' ,'new_val2' ,'custom1' ,'' , 'custom2' ,'' ,'234' ,'999'),
+(19, 'BPI:05' ,'BPI:03', 'TKI:000000000000000000000000000000000001', 'UPDATE', CURRENT_TIMESTAMP, 'USER_2_1', 'DOMAIN_A', 'WBI:100000000000000000000000000000000002', '11' , '' , '22' , '' , '' , 'L140101' , 'TASK' ,'DOCTYPE_DEFAULT' , 'created a bug' ,'' ,'' ,'custom1' ,'' , 'custom3' ,'' ,'123' ,'eee'),
+(20, 'BPI:02' ,'' , 'TKI:000000000000000000000000000000000000', 'CREATE', DATEADD('DAY', -2, CURRENT_TIMESTAMP), 'USER_1_2', 'DOMAIN_A', 'WBI:100000000000000000000000000000000001', '00' , 'PASystem', '00' , 'VNR' , '11223344', '' , '' ,'' , 'created by Peter' ,'2old_val' ,'new_val2' ,'custom1' ,'' , 'custom2' ,'' ,'234' ,'555'),
+(21, 'BPI:04' ,'BPI:04', 'TKI:000000000000000000000000000000000001', 'UPDATE', CURRENT_TIMESTAMP, 'USER_2_1', 'DOMAIN_A', 'WBI:100000000000000000000000000000000002', '11' , '' , '22' , '' , '' , 'L140101' , 'TASK' ,'DOCTYPE_DEFAULT' , 'created a bug' ,'' ,'' ,'custom1' ,'' , 'custom3' ,'' ,'123' ,'555'),
+(22, 'BPI:02' ,'' , 'TKI:000000000000000000000000000000000000', 'CREATE', DATEADD('DAY', -6, CURRENT_TIMESTAMP), 'USER_2_2', 'DOMAIN_A', 'WBI:100000000000000000000000000000000001', '00' , 'PASystem', '00' , 'VNR' , '77887564', '' , '' ,'' , 'created by Peter' ,'2old_val' ,'new_val2' ,'custom1' ,'' , 'custom2' ,'' ,'234' ,'SSS'),
+(23, 'BPI:03' ,'BPI:01', 'TKI:000000000000000000000000000000000001', 'DELETE', CURRENT_TIMESTAMP, 'USER_2_1', 'DOMAIN_A', 'WBI:100000000000000000000000000000000002', '11' , '' , '22' , '' , '' , 'L140101' , 'TASK' ,'DOCTYPE_DEFAULT' , 'created a bug' ,'' ,'' ,'custom1' ,'' , 'custom3' ,'' ,'PPP' ,'456'),
+(24, 'BPI:02' ,'' , 'TKI:000000000000000000000000000000000000', 'UPDATE', DATEADD('DAY', -1, CURRENT_TIMESTAMP), 'USER_1_2', 'DOMAIN_B', 'WBI:100000000000000000000000000000000001', '00' , 'PASystem', '00' , 'VNR' , '77887500', '' , '' ,'' , 'created by Peter' ,'2old_val' ,'new_val2' ,'custom1' ,'' , 'custom2' ,'' ,'234' ,'777'),
+(25, 'BPI:05' ,'BPI:03', 'TKI:000000000000000000000000000000000001', 'CREATE', CURRENT_TIMESTAMP, 'USER_2_1', 'DOMAIN_B', 'WBI:100000000000000000000000000000000002', '11' , '' , '22' , '' , '' , 'L140101' , 'TASK' ,'DOCTYPE_DEFAULT' , 'created a bug' ,'' ,'' ,'custom1' ,'' , 'custom3' ,'' ,'123' ,'ooo'),
+(26, 'BPI:02' ,'' , 'TKI:000000000000000000000000000000000000', 'DELETE', DATEADD('DAY', -2, CURRENT_TIMESTAMP), 'USER_2_1', 'DOMAIN_A', 'WBI:100000000000000000000000000000000001', '00' , 'PASystem', '00' , 'VNR' , '77887500', '' , '' ,'' , 'created by Peter' ,'2old_val' ,'new_val2' ,'custom1' ,'' , 'custom2' ,'' ,'234' ,'QQQ'),
+(27, 'BPI:05' ,'BPI:04', 'TKI:000000000000000000000000000000000001', 'UPDATE', CURRENT_TIMESTAMP, 'USER_2_1', 'DOMAIN_B', 'WBI:100000000000000000000000000000000002', '11' , '' , '22' , '' , '' , 'L140101' , 'TASK' ,'DOCTYPE_DEFAULT' , 'created a bug' ,'' ,'' ,'custom1' ,'' , 'custom3' ,'' ,'288' ,'456'),
+(28, 'BPI:02' ,'' , 'TKI:000000000000000000000000000000000000', 'CREATE', DATEADD('DAY', -5, CURRENT_TIMESTAMP), 'USER_2_2', 'DOMAIN_A', 'WBI:100000000000000000000000000000000001', '00' , 'PASystem', '00' , 'VNR' , '11223344', '' , '' ,'' , 'created by Peter' ,'2old_val' ,'new_val2' ,'custom1' ,'' , 'custom2' ,'' ,'234' ,'555'),
+(29, 'BPI:03' ,'BPI:05', 'TKI:000000000000000000000000000000000001', 'UPDATE', CURRENT_TIMESTAMP, 'USER_2_1', 'DOMAIN_A', 'WBI:100000000000000000000000000000000002', '11' , '' , '22' , '' , '' , 'L140101' , 'TASK' ,'DOCTYPE_DEFAULT' , 'created a bug' ,'' ,'' ,'custom1' ,'' , 'custom3' ,'' ,'000' ,'555'),
+(30, 'BPI:02' ,'' , 'TKI:000000000000000000000000000000000000', 'CREATE', DATEADD('DAY', -6, CURRENT_TIMESTAMP), 'USER_2_1', 'DOMAIN_A', 'WBI:100000000000000000000000000000000001', '00' , 'PASystem', '00' , 'VNR' , '11223344', '' , '' ,'' , 'created by Peter' ,'2old_val' ,'new_val2' ,'custom1' ,'' , 'custom2' ,'' ,'234' ,'777'),
+(31, 'BPI:04' ,'BPI:07', 'TKI:000000000000000000000000000000000001', 'UPDATE', CURRENT_TIMESTAMP, 'USER_2_1', 'DOMAIN_A', 'WBI:100000000000000000000000000000000002', '11' , '' , '22' , '' , '' , 'L140101' , 'TASK' ,'DOCTYPE_DEFAULT' , 'created a bug' ,'' ,'' ,'custom1' ,'' , 'custom3' ,'' ,'PPP' ,'eee'),
+(32, 'BPI:02' ,'' , 'TKI:000000000000000000000000000000000000', 'UPDATE', DATEADD('DAY', -5, CURRENT_TIMESTAMP), 'USER_1_2', 'DOMAIN_B', 'WBI:100000000000000000000000000000000001', '00' , 'PASystem', '00' , 'VNR' , '11223344', '' , '' ,'' , 'created by Peter' ,'2old_val' ,'new_val2' ,'custom1' ,'' , 'custom2' ,'' ,'234' ,'999'),
+(33, 'BPI:03' ,'BPI:01', 'TKI:000000000000000000000000000000000001', 'CREATE', CURRENT_TIMESTAMP, 'USER_2_1', 'DOMAIN_A', 'WBI:100000000000000000000000000000000002', '11' , '' , '22' , '' , '' , 'L140101' , 'TASK' ,'DOCTYPE_DEFAULT' , 'created a bug' ,'' ,'' ,'custom1' ,'' , 'custom3' ,'' ,'PPP' ,'ooo'),
+(34, 'BPI:02' ,'' , 'TKI:000000000000000000000000000000000000', 'CREATE', DATEADD('DAY', -1, CURRENT_TIMESTAMP), 'USER_1_1', 'DOMAIN_A', 'WBI:100000000000000000000000000000000001', '00' , 'PASystem', '00' , 'VNR' , '11223344', '' , '' ,'' , 'created by Peter' ,'2old_val' ,'new_val2' ,'custom1' ,'' , 'custom2' ,'' ,'234' ,'555'),
+(35, 'BPI:05' ,'BPI:03', 'TKI:000000000000000000000000000000000001', 'DELETE', CURRENT_TIMESTAMP, 'USER_2_1', 'DOMAIN_A', 'WBI:100000000000000000000000000000000002', '11' , '' , '22' , '' , '' , 'L140101' , 'TASK' ,'DOCTYPE_DEFAULT' , 'created a bug' ,'' ,'' ,'custom1' ,'' , 'custom3' ,'' ,'123' ,'777'),
+(36, 'BPI:02' ,'' , 'TKI:000000000000000000000000000000000000', 'UPDATE', DATEADD('DAY', -1, CURRENT_TIMESTAMP), 'USER_1_2', 'DOMAIN_A', 'WBI:100000000000000000000000000000000001', '00' , 'PASystem', '00' , 'VNR' , '77887500', '' , '' ,'' , 'created by Peter' ,'2old_val' ,'new_val2' ,'custom1' ,'' , 'custom2' ,'' ,'234' ,'SSS'),
+(37, 'BPI:06' ,'BPI:07', 'TKI:000000000000000000000000000000000001', 'DELETE', CURRENT_TIMESTAMP, 'USER_2_1', 'DOMAIN_B', 'WBI:100000000000000000000000000000000002', '11' , '' , '22' , '' , '' , 'L140101' , 'TASK' ,'DOCTYPE_DEFAULT' , 'created a bug' ,'' ,'' ,'custom1' ,'' , 'custom3' ,'' ,'123' ,'QQQ'),
+(38, 'BPI:02' ,'' , 'TKI:000000000000000000000000000000000000', 'UPDATE', DATEADD('DAY', -1, CURRENT_TIMESTAMP), 'USER_2_2', 'DOMAIN_B', 'WBI:100000000000000000000000000000000001', '00' , 'PASystem', '00' , 'VNR' , '11887500', '' , '' ,'' , 'created by Peter' ,'2old_val' ,'new_val2' ,'custom1' ,'' , 'custom2' ,'' ,'234' ,'456'),
+(39, 'BPI:03' ,'BPI:03', 'TKI:000000000000000000000000000000000001', 'CREATE', CURRENT_TIMESTAMP, 'USER_2_1', 'DOMAIN_B', 'WBI:100000000000000000000000000000000002', '11' , '' , '22' , '' , '' , 'L140101' , 'TASK' ,'DOCTYPE_DEFAULT' , 'created a bug' ,'' ,'' ,'custom1' ,'' , 'custom3' ,'' ,'000' ,'999'),
+(40, 'BPI:02' ,'' , 'TKI:000000000000000000000000000000000000', 'DELETE', DATEADD('DAY', -1, CURRENT_TIMESTAMP), 'USER_2_2', 'DOMAIN_B', 'WBI:100000000000000000000000000000000001', '00' , 'PASystem', '00' , 'VNR' , '11887599', '' , '' ,'' , 'created by Peter' ,'2old_val' ,'new_val2' ,'custom1' ,'' , 'custom2' ,'' ,'234' ,'eee'),
+(41, 'BPI:03' ,'BPI:04', 'TKI:000000000000000000000000000000000001', 'CREATE', CURRENT_TIMESTAMP, 'USER_2_1', 'DOMAIN_A', 'WBI:100000000000000000000000000000000002', '11' , '' , '22' , '' , '' , 'L140101' , 'TASK' ,'DOCTYPE_DEFAULT' , 'created a bug' ,'' ,'' ,'custom1' ,'' , 'custom3' ,'' ,'aaa' ,'555'),
+(42, 'BPI:02' ,'' , 'TKI:000000000000000000000000000000000000', 'CREATE', DATEADD('DAY', -6, CURRENT_TIMESTAMP), 'USER_1_2', 'DOMAIN_A', 'WBI:100000000000000000000000000000000001', '00' , 'PASystem', '00' , 'VNR' , '11223344', '' , '' ,'' , 'created by Peter' ,'2old_val' ,'new_val2' ,'custom1' ,'' , 'custom2' ,'' ,'234' ,'555'),
+(43, 'BPI:06' ,'BPI:03', 'TKI:000000000000000000000000000000000001', 'UPDATE', CURRENT_TIMESTAMP, 'USER_2_1', 'DOMAIN_A', 'WBI:100000000000000000000000000000000002', '11' , '' , '22' , '' , '' , 'L140101' , 'TASK' ,'DOCTYPE_DEFAULT' , 'created a bug' ,'' ,'' ,'custom1' ,'' , 'custom3' ,'' ,'acc' ,'ooo'),
+(44, 'BPI:02' ,'' , 'TKI:000000000000000000000000000000000000', 'DELETE', DATEADD('DAY', -1, CURRENT_TIMESTAMP), 'USER_1_2', 'DOMAIN_A', 'WBI:100000000000000000000000000000000001', '00' , 'PASystem', '00' , 'VNR' , '11223344', '' , '' ,'' , 'created by Peter' ,'2old_val' ,'new_val2' ,'custom1' ,'' , 'custom2' ,'' ,'234' ,'777'),
+(45, 'BPI:04' ,'BPI:03', 'TKI:000000000000000000000000000000000001', 'CREATE', CURRENT_TIMESTAMP, 'USER_2_1', 'DOMAIN_A', 'WBI:100000000000000000000000000000000002', '11' , '' , '22' , '' , '' , 'L140101' , 'TASK' ,'DOCTYPE_DEFAULT' , 'created a bug' ,'' ,'' ,'custom1' ,'' , 'custom3' ,'' ,'acc' ,'999'),
+(46, 'BPI:02' ,'' , 'TKI:000000000000000000000000000000000000', 'DELETE', DATEADD('DAY', -1, CURRENT_TIMESTAMP), 'USER_2_2', 'DOMAIN_B', 'WBI:100000000000000000000000000000000001', '00' , 'PASystem', '00' , 'VNR' , '11887599', '' , '' ,'' , 'created by Peter' ,'2old_val' ,'new_val2' ,'custom1' ,'' , 'custom2' ,'' ,'234' ,'999'),
+(47, 'BPI:03' ,'BPI:05', 'TKI:000000000000000000000000000000000001', 'UPDATE', CURRENT_TIMESTAMP, 'USER_2_1', 'DOMAIN_A', 'WBI:100000000000000000000000000000000002', '11' , '' , '22' , '' , '' , 'L140101' , 'TASK' ,'DOCTYPE_DEFAULT' , 'created a bug' ,'' ,'' ,'custom1' ,'' , 'custom3' ,'' ,'WWW' ,'SSS'),
+(48, 'BPI:02' ,'' , 'TKI:000000000000000000000000000000000000', 'UPDATE', DATEADD('DAY', -5, CURRENT_TIMESTAMP), 'USER_2_1', 'DOMAIN_B', 'WBI:100000000000000000000000000000000001', '00' , 'PASystem', '00' , 'VNR' , '11887599', '' , '' ,'' , 'created by Peter' ,'2old_val' ,'new_val2' ,'custom1' ,'' , 'custom2' ,'' ,'234' ,'eee'),
+(49, 'BPI:06' ,'BPI:05', 'TKI:000000000000000000000000000000000001', 'UPDATE', CURRENT_TIMESTAMP, 'USER_2_1', 'DOMAIN_A', 'WBI:100000000000000000000000000000000002', '11' , '' , '22' , '' , '' , 'L140101' , 'TASK' ,'DOCTYPE_DEFAULT' , 'created a bug' ,'' ,'' ,'custom1' ,'' , 'custom3' ,'' ,'123' ,'555'),
+(50, 'BPI:02' ,'' , 'TKI:000000000000000000000000000000000000', 'DELETE', DATEADD('DAY', -1, CURRENT_TIMESTAMP), 'USER_1_2', 'DOMAIN_B', 'WBI:100000000000000000000000000000000001', '00' , 'PASystem', '00' , 'VNR' , '11223344', '' , '' ,'' , 'created by Peter' ,'2old_val' ,'new_val2' ,'custom1' ,'' , 'custom2' ,'' ,'234' ,'777');
diff --git a/rest/taskana-history-rest-spring/src/test/java/pro/taskana/historyPlugin/config/TaskHistoryRestConfiguration.java b/rest/taskana-history-rest-spring/src/test/java/pro/taskana/historyPlugin/config/TaskHistoryRestConfiguration.java
new file mode 100644
index 000000000..7044d1f48
--- /dev/null
+++ b/rest/taskana-history-rest-spring/src/test/java/pro/taskana/historyPlugin/config/TaskHistoryRestConfiguration.java
@@ -0,0 +1,23 @@
+package pro.taskana.historyPlugin.config;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.transaction.annotation.EnableTransactionManagement;
+
+import pro.taskana.simplehistory.impl.SimpleHistoryServiceImpl;
+
+/**
+ * Configuration for Taskana history REST service.
+ */
+@Configuration
+@ComponentScan
+@EnableTransactionManagement
+public class TaskHistoryRestConfiguration {
+
+ @Bean
+ public SimpleHistoryServiceImpl getSimpleHistoryService() {
+ return new SimpleHistoryServiceImpl();
+ }
+
+}
diff --git a/rest/taskana-history-rest-spring/src/test/java/pro/taskana/historyPlugin/doc/api/TaskHistoryEventControllerRestDocumentation.java b/rest/taskana-history-rest-spring/src/test/java/pro/taskana/historyPlugin/doc/api/TaskHistoryEventControllerRestDocumentation.java
new file mode 100644
index 000000000..b6a2c1f1a
--- /dev/null
+++ b/rest/taskana-history-rest-spring/src/test/java/pro/taskana/historyPlugin/doc/api/TaskHistoryEventControllerRestDocumentation.java
@@ -0,0 +1,157 @@
+package pro.taskana.historyPlugin.doc.api;
+
+import static org.springframework.restdocs.mockmvc.MockMvcRestDocumentation.document;
+import static org.springframework.restdocs.mockmvc.MockMvcRestDocumentation.documentationConfiguration;
+import static org.springframework.restdocs.operation.preprocess.Preprocessors.preprocessRequest;
+import static org.springframework.restdocs.operation.preprocess.Preprocessors.preprocessResponse;
+import static org.springframework.restdocs.operation.preprocess.Preprocessors.prettyPrint;
+import static org.springframework.restdocs.payload.PayloadDocumentation.fieldWithPath;
+import static org.springframework.restdocs.payload.PayloadDocumentation.responseFields;
+import static org.springframework.restdocs.payload.PayloadDocumentation.subsectionWithPath;
+
+import java.util.HashMap;
+
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.boot.web.server.LocalServerPort;
+import org.springframework.restdocs.JUnitRestDocumentation;
+import org.springframework.restdocs.mockmvc.MockMvcRestDocumentation;
+import org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders;
+import org.springframework.restdocs.payload.FieldDescriptor;
+import org.springframework.test.context.junit4.SpringRunner;
+import org.springframework.test.web.servlet.MockMvc;
+import org.springframework.test.web.servlet.result.MockMvcResultMatchers;
+import org.springframework.test.web.servlet.setup.MockMvcBuilders;
+import org.springframework.web.context.WebApplicationContext;
+
+import pro.taskana.historyPlugin.config.TaskHistoryRestConfiguration;
+import pro.taskana.rest.RestConfiguration;
+
+@RunWith(SpringRunner.class)
+@SpringBootTest(classes = {RestConfiguration.class, TaskHistoryRestConfiguration.class}, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
+public class TaskHistoryEventControllerRestDocumentation {
+
+ @LocalServerPort
+ int port;
+
+ @Rule
+ public JUnitRestDocumentation restDocumentation = new JUnitRestDocumentation();
+
+ @Autowired
+ private WebApplicationContext context;
+
+ private MockMvc mockMvc;
+
+ private HashMap taskHistoryEventFieldDescriptionsMap = new HashMap();
+
+ private FieldDescriptor[] allTaskHistoryEventFieldDescriptors;
+ private FieldDescriptor[] taskHistoryEventFieldDescriptors;
+
+ @Before
+ public void setUp() {
+ document("{methodName}",
+ preprocessRequest(prettyPrint()),
+ preprocessResponse(prettyPrint()));
+
+ this.mockMvc = MockMvcBuilders.webAppContextSetup(this.context)
+ .apply(documentationConfiguration(this.restDocumentation)
+ .operationPreprocessors()
+ .withResponseDefaults(prettyPrint())
+ .withRequestDefaults(prettyPrint()))
+ .build();
+
+ taskHistoryEventFieldDescriptionsMap.put("_embedded.taskHistoryId","Unique ID");
+ taskHistoryEventFieldDescriptionsMap.put("_embedded.businessProcessId","The id of the business process");
+ taskHistoryEventFieldDescriptionsMap.put("_embedded.parentBusinessProcessId","The id of the parent business process");
+ taskHistoryEventFieldDescriptionsMap.put("_embedded.taskId","The id of the task");
+ taskHistoryEventFieldDescriptionsMap.put("_embedded.eventType","The type of the event");
+ taskHistoryEventFieldDescriptionsMap.put("_embedded.created","The time was created");
+ taskHistoryEventFieldDescriptionsMap.put("_embedded.userId","The id of the user");
+ taskHistoryEventFieldDescriptionsMap.put("_embedded.domain","Domain");
+ taskHistoryEventFieldDescriptionsMap.put("_embedded.workbasketKey","The key of workbasket");
+ taskHistoryEventFieldDescriptionsMap.put("_embedded.porCompany","");
+ taskHistoryEventFieldDescriptionsMap.put("_embedded.porSystem","");
+ taskHistoryEventFieldDescriptionsMap.put("_embedded.porInstance","");
+ taskHistoryEventFieldDescriptionsMap.put("_embedded.porValue","");
+ taskHistoryEventFieldDescriptionsMap.put("_embedded.porType","");
+ taskHistoryEventFieldDescriptionsMap.put("_embedded.taskClassificationKey","The key of classification task");
+ taskHistoryEventFieldDescriptionsMap.put("_embedded.taskClassificationCategory","The category of classification");
+ taskHistoryEventFieldDescriptionsMap.put("_embedded.attachmentClassificationKey","");
+ taskHistoryEventFieldDescriptionsMap.put("_embedded.comment","");
+ taskHistoryEventFieldDescriptionsMap.put("_embedded.oldValue","The old value");
+ taskHistoryEventFieldDescriptionsMap.put("_embedded.newValue","The new value");
+ taskHistoryEventFieldDescriptionsMap.put("_embedded.custom1","A custom property with name \"1\"");
+ taskHistoryEventFieldDescriptionsMap.put("_embedded.custom2","A custom property with name \"2\"");
+ taskHistoryEventFieldDescriptionsMap.put("_embedded.custom3","A custom property with name \"3\"");
+ taskHistoryEventFieldDescriptionsMap.put("_embedded.custom4","A custom property with name \"4\"");
+ taskHistoryEventFieldDescriptionsMap.put("_embedded.oldData","The old data");
+ taskHistoryEventFieldDescriptionsMap.put("_embedded.newData","The new data");
+ taskHistoryEventFieldDescriptionsMap.put("_links.self.href","The links of this task history event");
+ taskHistoryEventFieldDescriptionsMap.put("_links.allTaskHistoryEvent.href","Link to all task history event");
+ taskHistoryEventFieldDescriptionsMap.put("_links.first.href","Link to the first result");
+ taskHistoryEventFieldDescriptionsMap.put("_links.last.href","Link to the last result");
+
+ allTaskHistoryEventFieldDescriptors = new FieldDescriptor[] {
+ subsectionWithPath("_embedded.taskHistoryEventResourceList").description("An array of Task history event"),
+ fieldWithPath("_links.self.href").ignored(),
+ fieldWithPath("page").ignored()
+ };
+
+ taskHistoryEventFieldDescriptors = new FieldDescriptor[] {
+ fieldWithPath("_embedded.taskHistoryEventResourceList[].taskHistoryId").description(taskHistoryEventFieldDescriptionsMap.get("_embedded.taskHistoryId")),
+ fieldWithPath("_embedded.taskHistoryEventResourceList[].businessProcessId").description(taskHistoryEventFieldDescriptionsMap.get("_embedded.businessProcessId")),
+ fieldWithPath("_embedded.taskHistoryEventResourceList[].parentBusinessProcessId").description(taskHistoryEventFieldDescriptionsMap.get("_embedded.parentBusinessProcessId")),
+ fieldWithPath("_embedded.taskHistoryEventResourceList[].taskId").description(taskHistoryEventFieldDescriptionsMap.get("_embedded.taskId")),
+ fieldWithPath("_embedded.taskHistoryEventResourceList[].eventType").description(taskHistoryEventFieldDescriptionsMap.get("_embedded.eventType")),
+ fieldWithPath("_embedded.taskHistoryEventResourceList[].created").description(taskHistoryEventFieldDescriptionsMap.get("_embedded.created")),
+ fieldWithPath("_embedded.taskHistoryEventResourceList[].userId").description(taskHistoryEventFieldDescriptionsMap.get("_embedded.userId")),
+ fieldWithPath("_embedded.taskHistoryEventResourceList[].domain").description(taskHistoryEventFieldDescriptionsMap.get("_embedded.domain")),
+ fieldWithPath("_embedded.taskHistoryEventResourceList[].workbasketKey").description(taskHistoryEventFieldDescriptionsMap.get("_embedded.workbasketKey")),
+ fieldWithPath("_embedded.taskHistoryEventResourceList[].porCompany").description(taskHistoryEventFieldDescriptionsMap.get("_embedded.porCompany")),
+ fieldWithPath("_embedded.taskHistoryEventResourceList[].porSystem").description(taskHistoryEventFieldDescriptionsMap.get("_embedded.porSystem")),
+ fieldWithPath("_embedded.taskHistoryEventResourceList[].porInstance").description(taskHistoryEventFieldDescriptionsMap.get("_embedded.porInstance")),
+ fieldWithPath("_embedded.taskHistoryEventResourceList[].porValue").description(taskHistoryEventFieldDescriptionsMap.get("_embedded.porValue")),
+ fieldWithPath("_embedded.taskHistoryEventResourceList[].porType").description(taskHistoryEventFieldDescriptionsMap.get("_embedded.porType")),
+ fieldWithPath("_embedded.taskHistoryEventResourceList[].taskClassificationKey").description(taskHistoryEventFieldDescriptionsMap.get("_embedded.taskClassificationKey")),
+ fieldWithPath("_embedded.taskHistoryEventResourceList[].taskClassificationCategory").description(taskHistoryEventFieldDescriptionsMap.get("_embedded.taskClassificationCategory")),
+ fieldWithPath("_embedded.taskHistoryEventResourceList[].attachmentClassificationKey").description(taskHistoryEventFieldDescriptionsMap.get("_embedded.attachmentClassificationKey")),
+ fieldWithPath("_embedded.taskHistoryEventResourceList[].comment").description(taskHistoryEventFieldDescriptionsMap.get("_embedded.comment")),
+ fieldWithPath("_embedded.taskHistoryEventResourceList[].oldValue").description(taskHistoryEventFieldDescriptionsMap.get("_embedded.oldValue")),
+ fieldWithPath("_embedded.taskHistoryEventResourceList[].newValue").description(taskHistoryEventFieldDescriptionsMap.get("_embedded.newValue")),
+ fieldWithPath("_embedded.taskHistoryEventResourceList[].custom1").description(taskHistoryEventFieldDescriptionsMap.get("_embedded.custom1")),
+ fieldWithPath("_embedded.taskHistoryEventResourceList[].custom2").description(taskHistoryEventFieldDescriptionsMap.get("_embedded.custom2")),
+ fieldWithPath("_embedded.taskHistoryEventResourceList[].custom3").description(taskHistoryEventFieldDescriptionsMap.get("_embedded.custom3")),
+ fieldWithPath("_embedded.taskHistoryEventResourceList[].custom4").description(taskHistoryEventFieldDescriptionsMap.get("_embedded.custom4")),
+ fieldWithPath("_embedded.taskHistoryEventResourceList[].oldData").description(taskHistoryEventFieldDescriptionsMap.get("_embedded.oldData")),
+ fieldWithPath("_embedded.taskHistoryEventResourceList[].newData").description(taskHistoryEventFieldDescriptionsMap.get("_embedded.newData")),
+ fieldWithPath("_links.self.href").ignored(),
+ fieldWithPath("page").ignored()
+ };
+ }
+
+ @Test
+ public void getAllTaskHistoryEventDocTest() throws Exception {
+ this.mockMvc.perform(
+ RestDocumentationRequestBuilders.get("http://127.0.0.1:" + port + "/v1/task-history-event")
+ .accept("application/hal+json")
+ .header("Authorization", "Basic dGVhbWxlYWRfMTp0ZWFtbGVhZF8x"))
+ .andExpect(MockMvcResultMatchers.status().isOk())
+ .andDo(MockMvcRestDocumentation.document("GetAllTaskHistoryEventDocTest",
+ responseFields(allTaskHistoryEventFieldDescriptors)));
+ }
+
+ @Test
+ public void getSpecificTaskHistoryEventDocTest() throws Exception {
+ this.mockMvc.perform(RestDocumentationRequestBuilders.get(
+ "http://127.0.0.1:" + port + "/v1/task-history-event?business-process-id=BPI:02")
+ .accept("application/hal+json")
+ .header("Authorization", "Basic dGVhbWxlYWRfMTp0ZWFtbGVhZF8x"))
+ .andExpect(MockMvcResultMatchers.status().isOk())
+ .andDo(MockMvcRestDocumentation.document("GetSpecificTaskHistoryEventDocTest",
+ responseFields(taskHistoryEventFieldDescriptors)));
+ }
+}
diff --git a/rest/taskana-history-rest-spring/src/test/java/pro/taskana/historyPlugin/rest/TaskHistoryEventControllerIntTest.java b/rest/taskana-history-rest-spring/src/test/java/pro/taskana/historyPlugin/rest/TaskHistoryEventControllerIntTest.java
new file mode 100644
index 000000000..c988a5db6
--- /dev/null
+++ b/rest/taskana-history-rest-spring/src/test/java/pro/taskana/historyPlugin/rest/TaskHistoryEventControllerIntTest.java
@@ -0,0 +1,154 @@
+package pro.taskana.historyPlugin.rest;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+import java.util.Collections;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.boot.web.server.LocalServerPort;
+import org.springframework.core.ParameterizedTypeReference;
+import org.springframework.hateoas.Link;
+import org.springframework.hateoas.PagedResources;
+import org.springframework.hateoas.hal.Jackson2HalModule;
+import org.springframework.http.HttpEntity;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.HttpMethod;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.MediaType;
+import org.springframework.http.ResponseEntity;
+import org.springframework.http.converter.HttpMessageConverter;
+import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
+import org.springframework.test.context.ActiveProfiles;
+import org.springframework.test.context.junit4.SpringRunner;
+import org.springframework.web.client.HttpClientErrorException;
+import org.springframework.web.client.RestTemplate;
+
+import com.fasterxml.jackson.databind.DeserializationFeature;
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+import pro.taskana.historyPlugin.config.TaskHistoryRestConfiguration;
+import pro.taskana.rest.RestConfiguration;
+import pro.taskana.rest.resource.TaskHistoryEventResource;
+
+@RunWith(SpringRunner.class)
+@SpringBootTest(classes = {RestConfiguration.class, TaskHistoryRestConfiguration.class},
+ webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT, properties = {"devMode=true"})
+@ActiveProfiles(profiles = "history.plugin")
+public class TaskHistoryEventControllerIntTest {
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(TaskHistoryEventControllerIntTest.class);
+ String server = "http://127.0.0.1:";
+ RestTemplate template;
+ HttpEntity request;
+ @LocalServerPort
+ int port;
+
+ @Before
+ public void before() {
+ template = getRestTemplate();
+ HttpHeaders headers = new HttpHeaders();
+ headers.add("Authorization", "Basic dGVhbWxlYWRfMTp0ZWFtbGVhZF8x");
+ request = new HttpEntity(headers);
+ }
+
+ @Test
+ public void testGetAllHistoryEvent() {
+ ResponseEntity> response = template.exchange(
+ server + port + "/v1/task-history-event", HttpMethod.GET, request,
+ new ParameterizedTypeReference>() {
+ });
+ assertNotNull(response.getBody().getLink(Link.REL_SELF));
+ assertEquals(50, response.getBody().getContent().size());
+ }
+
+ @Test
+ public void testGetAllHistoryEventDescendingOrder() {
+ String parameters = "/v1/task-history-event?sort-by=business-process-id&order=desc&page-size=6&page=1";
+ ResponseEntity> response = template.exchange(
+ server + port + parameters, HttpMethod.GET, request,
+ new ParameterizedTypeReference>() {
+ });
+ assertNotNull(response.getBody().getLink(Link.REL_SELF));
+ assertEquals(6, response.getBody().getContent().size());
+ assertTrue(response.getBody()
+ .getLink(Link.REL_SELF)
+ .getHref()
+ .endsWith(parameters));
+ }
+
+ @Test
+ public void testGetSpecificTaskHistoryEvent() {
+ ResponseEntity> response = template.exchange(
+ server + port + "/v1/task-history-event?business-process-id=BPI:01&sort-by=business-process-id&order=asc&page-size=6&page=1",
+ HttpMethod.GET, request,
+ new ParameterizedTypeReference>() {
+ });
+ assertNotNull(response.getBody().getLink(Link.REL_SELF));
+ assertNotNull(response.getBody().getLinks());
+ assertNotNull(response.getBody().getMetadata());
+ assertEquals(1, response.getBody().getContent().size());
+ }
+
+ @Test
+ public void testThrowsExceptionIfInvalidFilterIsUsed() {
+ try {
+ template.exchange(
+ server + port + "/v1/task-history-event?invalid=BPI:01", HttpMethod.GET, request,
+ new ParameterizedTypeReference>() {
+ });
+ fail();
+ } catch (HttpClientErrorException e) {
+ assertEquals(HttpStatus.BAD_REQUEST, e.getStatusCode());
+ assertTrue(e.getResponseBodyAsString().contains("[invalid]"));
+ }
+ }
+
+ @Test
+ public void testGetSecondPageSortedByKey() {
+ String parameters = "/v1/task-history-event?sort-by=workbasket-key&order=desc&page=2&page-size=2";
+ ResponseEntity> response = template.exchange(
+ server + port + parameters, HttpMethod.GET, request,
+ new ParameterizedTypeReference>() {
+ });
+ assertEquals(2, response.getBody().getContent().size());
+ assertEquals("WBI:100000000000000000000000000000000002", response.getBody().getContent().iterator().next().getWorkbasketKey());
+ assertNotNull(response.getBody().getLink(Link.REL_SELF));
+ assertTrue(response.getBody()
+ .getLink(Link.REL_SELF)
+ .getHref()
+ .endsWith(parameters));
+ assertNotNull(response.getBody().getLink("allTaskHistoryEvent"));
+ assertTrue(response.getBody()
+ .getLink("allTaskHistoryEvent")
+ .getHref()
+ .endsWith("/v1/task-history-event"));
+ assertNotNull(response.getBody().getLink(Link.REL_FIRST));
+ assertNotNull(response.getBody().getLink(Link.REL_LAST));
+ }
+
+ /**
+ * Return a REST template which is capable of dealing with responses in HAL format
+ *
+ * @return RestTemplate
+ */
+ private RestTemplate getRestTemplate() {
+ ObjectMapper mapper = new ObjectMapper();
+ mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
+ mapper.registerModule(new Jackson2HalModule());
+
+ MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
+ converter.setSupportedMediaTypes(MediaType.parseMediaTypes("application/hal+json"));
+ converter.setObjectMapper(mapper);
+
+ RestTemplate template = new RestTemplate(Collections.>singletonList(converter));
+ return template;
+ }
+}
diff --git a/rest/taskana-history-rest-spring/src/test/resources/application.properties b/rest/taskana-history-rest-spring/src/test/resources/application.properties
new file mode 100644
index 000000000..4da1feb99
--- /dev/null
+++ b/rest/taskana-history-rest-spring/src/test/resources/application.properties
@@ -0,0 +1 @@
+logging.level.pro.taskana=INFO
diff --git a/rest/taskana-rest-spring-example/pom.xml b/rest/taskana-rest-spring-example/pom.xml
index 42e6cade9..48038638d 100644
--- a/rest/taskana-rest-spring-example/pom.xml
+++ b/rest/taskana-rest-spring-example/pom.xml
@@ -48,7 +48,7 @@
pro.taskana.simplehistory
taskana-simplehistory-provider
- 0.0.4
+ 0.0.6
@@ -162,6 +162,11 @@
org.springframework.boot
spring-boot-starter-thymeleaf
+
+ pro.taskana
+ taskana-history-rest-spring
+ 1.0.5-SNAPSHOT
+
@@ -299,6 +304,28 @@
+
+ copy-history-rest-spring-docs
+ prepare-package
+
+ copy-resources
+
+
+
+ ${project.build.outputDirectory}/static/docs/rest
+
+
+
+
+ ${project.build.directory}/generated-docs
+
+
+
+ ../taskana-history-rest-spring/target/apidocs
+
+
+
+
diff --git a/rest/taskana-rest-spring-example/src/main/asciidoc/rest-api.adoc b/rest/taskana-rest-spring-example/src/main/asciidoc/rest-api.adoc
index a6cc5bd1d..db5a3f4f6 100644
--- a/rest/taskana-rest-spring-example/src/main/asciidoc/rest-api.adoc
+++ b/rest/taskana-rest-spring-example/src/main/asciidoc/rest-api.adoc
@@ -784,3 +784,24 @@ include::../../../{snippets}/CommonSummaryResourceFields/http-request.adoc[]
include::../../../{snippets}/CommonSummaryResourceFields/response-body.adoc[]
+== History event
+
+=== Get all task history event
+
+==== Example request
+
+include::../../../{snippets}/GetAllTaskHistoryEventDocTest/http-request.adoc[]
+
+==== Example response
+
+include::../../../{snippets}/GetAllTaskHistoryEventDocTest/response-body.adoc[]
+
+=== Get a specific task history event
+
+==== Example request
+
+include::../../../{snippets}/GetSpecificTaskHistoryEventDocTest/http-request.adoc[]
+
+==== Example response
+
+include::../../../{snippets}/GetSpecificTaskHistoryEventDocTest/response-body.adoc[]
diff --git a/rest/taskana-rest-spring-example/src/main/java/pro/taskana/rest/ExampleRestApplication.java b/rest/taskana-rest-spring-example/src/main/java/pro/taskana/rest/ExampleRestApplication.java
index 023bb7967..5dd7ba00b 100644
--- a/rest/taskana-rest-spring-example/src/main/java/pro/taskana/rest/ExampleRestApplication.java
+++ b/rest/taskana-rest-spring-example/src/main/java/pro/taskana/rest/ExampleRestApplication.java
@@ -73,9 +73,9 @@ public class ExampleRestApplication {
}
@Bean
- @DependsOn("taskanaEngineConfiguration") // generate sample data after schema was inserted
+ @DependsOn("getTaskanaEngine") // generate sample data after schema was inserted
public SampleDataGenerator generateSampleData(DataSource dataSource) throws SQLException {
- SampleDataGenerator sampleDataGenerator = new SampleDataGenerator(dataSource);
+ sampleDataGenerator = new SampleDataGenerator(dataSource);
return sampleDataGenerator;
}
diff --git a/rest/taskana-rest-spring-example/src/main/java/pro/taskana/sampledata/SampleDataGenerator.java b/rest/taskana-rest-spring-example/src/main/java/pro/taskana/sampledata/SampleDataGenerator.java
index 5e9d182af..703b86cce 100644
--- a/rest/taskana-rest-spring-example/src/main/java/pro/taskana/sampledata/SampleDataGenerator.java
+++ b/rest/taskana-rest-spring-example/src/main/java/pro/taskana/sampledata/SampleDataGenerator.java
@@ -30,6 +30,7 @@ public class SampleDataGenerator {
private static final String CLASSIFICATION = SQL + TEST_DATA + "/classification.sql";
private static final String OBJECT_REFERENCE = SQL + TEST_DATA + "/object-reference.sql";
private static final String ATTACHMENT = SQL + TEST_DATA + "/attachment.sql";
+ private static final String HISTORY_EVENT = SQL + TEST_DATA + "/history-event.sql";
private ScriptRunner runner;
DataSource dataSource;
@@ -76,6 +77,8 @@ public class SampleDataGenerator {
this.getClass().getResourceAsStream(WORKBASKET_ACCESS_LIST), StandardCharsets.UTF_8)));
runner.runScript(new BufferedReader(
new InputStreamReader(this.getClass().getResourceAsStream(OBJECT_REFERENCE), StandardCharsets.UTF_8)));
+ runner.runScript(new BufferedReader(
+ new InputStreamReader(this.getClass().getResourceAsStream(HISTORY_EVENT), StandardCharsets.UTF_8)));
runner.closeConnection();
diff --git a/rest/taskana-rest-spring-example/src/main/resources/sql/sample-data/clear-db.sql b/rest/taskana-rest-spring-example/src/main/resources/sql/sample-data/clear-db.sql
index beab7c25a..1a565e7fc 100644
--- a/rest/taskana-rest-spring-example/src/main/resources/sql/sample-data/clear-db.sql
+++ b/rest/taskana-rest-spring-example/src/main/resources/sql/sample-data/clear-db.sql
@@ -6,6 +6,7 @@ DELETE FROM WORKBASKET;
DELETE FROM DISTRIBUTION_TARGETS;
DELETE FROM CLASSIFICATION;
DELETE FROM OBJECT_REFERENCE;
+DELETE FROM HISTORY_EVENTS;
-- do not clean JOB table
-- DELETE FROM SCHEDULED_JOB;
COMMIT;
diff --git a/rest/taskana-rest-spring-example/src/main/resources/sql/sample-data/drop-tables.sql b/rest/taskana-rest-spring-example/src/main/resources/sql/sample-data/drop-tables.sql
index f72521dab..d7aeafa91 100644
--- a/rest/taskana-rest-spring-example/src/main/resources/sql/sample-data/drop-tables.sql
+++ b/rest/taskana-rest-spring-example/src/main/resources/sql/sample-data/drop-tables.sql
@@ -7,5 +7,6 @@ DROP TABLE DISTRIBUTION_TARGETS;
DROP TABLE CLASSIFICATION;
DROP TABLE OBJECT_REFERENCE;
DROP TABLE SCHEDULED_JOB;
+DROP TABLE HISTORY_EVENTS;
DROP SEQUENCE SCHEDULED_JOB_SEQ;
COMMIT;
diff --git a/rest/taskana-rest-spring-example/src/main/resources/sql/sample-data/history-event.sql b/rest/taskana-rest-spring-example/src/main/resources/sql/sample-data/history-event.sql
new file mode 100644
index 000000000..764be4353
--- /dev/null
+++ b/rest/taskana-rest-spring-example/src/main/resources/sql/sample-data/history-event.sql
@@ -0,0 +1,7 @@
+SET SCHEMA TASKANA;
+
+INSERT INTO HISTORY_EVENTS (BUSINESS_PROCESS_ID, PARENT_BUSINESS_PROCESS_ID, TASK_ID, EVENT_TYPE, CREATED, USER_ID, DOMAIN, WORKBASKET_KEY, POR_COMPANY, POR_SYSTEM, POR_INSTANCE, POR_TYPE, POR_VALUE, TASK_CLASSIFICATION_KEY, TASK_CLASSIFICATION_CATEGORY, ATTACHMENT_CLASSIFICATION_KEY, COMMENT, OLD_VALUE, NEW_VALUE, CUSTOM_1, CUSTOM_2, CUSTOM_3, CUSTOM_4, OLD_DATA, NEW_DATA) VALUES
+-- BUSINESS_PROCESS_ID, PARENT_BUSINESS_PROCESS_ID, TASK_ID, EVENT_TYPE, CREATED, USER_ID, DOMAIN, WORKBASKET_KEY, POR_COMPANY , POR_SYSTEM, POR_INSTANCE , POR_TYPE , POR_VALUE , TASK_CLASSIFICATION_KEY, TASK_CLASSIFICATION_CATEGORY , ATTACHMENT_CLASSIFICATION_KEY , COMMENT , OLD_VALUE , NEW_VALUE , CUSTOM_1 , CUSTOM_2 , CUSTOM_3 , CUSTOM_4 , OLD_DATA , NEW_DATA
+('BPI:01' ,'' ,'TKI:000000000000000000000000000000000000', 'CREATE', CURRENT_TIMESTAMP , 'USER_2_2', 'DOMAIN_B', 'WBI:100000000000000000000000000000000001', '00' , 'PASystem', '00' , 'VNR' , '11223344', 'L140101' , 'TASK' ,'' , 'this task has been created' ,'old_val' ,'new_val' ,'custom1' ,'custom2' , 'custom3' ,'custom4' ,'123' ,'456'),
+('BPI:02' ,'' ,'TKI:000000000000000000000000000000000000', 'CREATE', DATEADD('DAY', -2, CURRENT_TIMESTAMP),'USER_1_1', 'DOMAIN_A', 'WBI:100000000000000000000000000000000001', '00' , 'PASystem', '00' , 'VNR' , '11223344', '' , '' ,'' , 'created by Peter' ,'2old_val' ,'new_val2' ,'custom1' ,'' , 'custom2' ,'' ,'234' ,'456'),
+('BPI:03' ,'BPI:01','TKI:000000000000000000000000000000000001', 'CREATE', CURRENT_TIMESTAMP , 'USER_2_1', 'DOMAIN_A', 'WBI:100000000000000000000000000000000002', '11' , '' , '22' , '' , '' , 'L140101' , 'TASK' ,'DOCTYPE_DEFAULT' , 'created a bug' ,'' ,'' ,'custom1' ,'' , 'custom3' ,'' ,'123' ,'456');
diff --git a/rest/taskana-rest-spring-example/src/test/java/pro/taskana/historyPlugin/HistoryPluginLoaderTest.java b/rest/taskana-rest-spring-example/src/test/java/pro/taskana/historyPlugin/HistoryPluginLoaderTest.java
index 0663737fc..7241ac9c5 100644
--- a/rest/taskana-rest-spring-example/src/test/java/pro/taskana/historyPlugin/HistoryPluginLoaderTest.java
+++ b/rest/taskana-rest-spring-example/src/test/java/pro/taskana/historyPlugin/HistoryPluginLoaderTest.java
@@ -9,6 +9,7 @@ import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.jdbc.core.JdbcTemplate;
+import org.springframework.test.context.ActiveProfiles;
import org.springframework.test.context.junit4.SpringRunner;
import pro.taskana.TaskanaEngine;
@@ -17,6 +18,7 @@ import pro.taskana.impl.TaskanaEngineImpl;
import pro.taskana.rest.RestConfiguration;
@RunWith(SpringRunner.class)
+@ActiveProfiles(profiles = "history.plugin")
@SpringBootTest(classes = RestConfiguration.class)
public class HistoryPluginLoaderTest {
diff --git a/rest/taskana-rest-spring-example/src/test/java/pro/taskana/jobs/AsyncUpdateJobIntTest.java b/rest/taskana-rest-spring-example/src/test/java/pro/taskana/jobs/AsyncUpdateJobIntTest.java
index 46505bd9c..98812190f 100644
--- a/rest/taskana-rest-spring-example/src/test/java/pro/taskana/jobs/AsyncUpdateJobIntTest.java
+++ b/rest/taskana-rest-spring-example/src/test/java/pro/taskana/jobs/AsyncUpdateJobIntTest.java
@@ -47,8 +47,8 @@ import pro.taskana.exceptions.InvalidArgumentException;
import pro.taskana.rest.RestConfiguration;
import pro.taskana.rest.resource.ClassificationResource;
import pro.taskana.rest.resource.TaskResource;
-import pro.taskana.rest.resource.assembler.ClassificationResourceAssembler;
-import pro.taskana.rest.resource.assembler.TaskResourceAssembler;
+import pro.taskana.rest.resource.ClassificationResourceAssembler;
+import pro.taskana.rest.resource.TaskResourceAssembler;
@RunWith(SpringRunner.class)
@SpringBootTest(classes = RestConfiguration.class, webEnvironment = WebEnvironment.RANDOM_PORT,
diff --git a/rest/taskana-rest-spring-example/src/test/java/pro/taskana/rest/ClassificationControllerIntTest.java b/rest/taskana-rest-spring-example/src/test/java/pro/taskana/rest/ClassificationControllerIntTest.java
index 165906b69..32f543b55 100644
--- a/rest/taskana-rest-spring-example/src/test/java/pro/taskana/rest/ClassificationControllerIntTest.java
+++ b/rest/taskana-rest-spring-example/src/test/java/pro/taskana/rest/ClassificationControllerIntTest.java
@@ -45,8 +45,8 @@ import pro.taskana.Task;
import pro.taskana.exceptions.InvalidArgumentException;
import pro.taskana.rest.resource.ClassificationSummaryResource;
import pro.taskana.rest.resource.TaskResource;
-import pro.taskana.rest.resource.assembler.ClassificationResourceAssembler;
-import pro.taskana.rest.resource.assembler.TaskResourceAssembler;
+import pro.taskana.rest.resource.ClassificationResourceAssembler;
+import pro.taskana.rest.resource.TaskResourceAssembler;
@RunWith(SpringRunner.class)
@SpringBootTest(classes = RestConfiguration.class, webEnvironment = WebEnvironment.RANDOM_PORT,
diff --git a/rest/taskana-rest-spring-example/src/test/java/pro/taskana/rest/GenenalExceptionHandlingTest.java b/rest/taskana-rest-spring-example/src/test/java/pro/taskana/rest/GenenalExceptionHandlingTest.java
index 237a1a19d..1a45f3ab0 100644
--- a/rest/taskana-rest-spring-example/src/test/java/pro/taskana/rest/GenenalExceptionHandlingTest.java
+++ b/rest/taskana-rest-spring-example/src/test/java/pro/taskana/rest/GenenalExceptionHandlingTest.java
@@ -27,7 +27,6 @@ import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.http.MediaType;
-import org.springframework.http.ResponseEntity;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.test.context.junit4.SpringRunner;
@@ -41,8 +40,8 @@ import ch.qos.logback.core.Appender;
import pro.taskana.ldap.LdapCacheTestImpl;
import pro.taskana.rest.resource.AccessIdResource;
import pro.taskana.rest.resource.ClassificationSummaryResource;
-import pro.taskana.rest.resource.assembler.ClassificationResourceAssembler;
-import pro.taskana.rest.resource.assembler.TaskResourceAssembler;
+import pro.taskana.rest.resource.ClassificationResourceAssembler;
+import pro.taskana.rest.resource.TaskResourceAssembler;
@RunWith(SpringRunner.class)
@SpringBootTest(classes = RestConfiguration.class, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT, properties = {
diff --git a/rest/taskana-rest-spring-example/src/test/java/pro/taskana/rest/TaskanaEngineControllerIntTest.java b/rest/taskana-rest-spring-example/src/test/java/pro/taskana/rest/TaskanaEngineControllerIntTest.java
index 65848b707..c67706f58 100644
--- a/rest/taskana-rest-spring-example/src/test/java/pro/taskana/rest/TaskanaEngineControllerIntTest.java
+++ b/rest/taskana-rest-spring-example/src/test/java/pro/taskana/rest/TaskanaEngineControllerIntTest.java
@@ -12,7 +12,6 @@ import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.context.SpringBootTest.WebEnvironment;
import org.springframework.boot.web.server.LocalServerPort;
-import org.springframework.context.annotation.Import;
import org.springframework.core.ParameterizedTypeReference;
import org.springframework.hateoas.hal.Jackson2HalModule;
import org.springframework.http.HttpEntity;
diff --git a/rest/taskana-rest-spring-example/src/test/java/pro/taskana/rest/TestSchemaNameCustomizable.java b/rest/taskana-rest-spring-example/src/test/java/pro/taskana/rest/TestSchemaNameCustomizable.java
index 7dbd0b8e0..33f1ef612 100644
--- a/rest/taskana-rest-spring-example/src/test/java/pro/taskana/rest/TestSchemaNameCustomizable.java
+++ b/rest/taskana-rest-spring-example/src/test/java/pro/taskana/rest/TestSchemaNameCustomizable.java
@@ -1,8 +1,5 @@
package pro.taskana.rest;
-import static org.junit.Assert.assertEquals;
-
-import java.io.StringReader;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
@@ -10,20 +7,13 @@ import java.util.Collections;
import javax.sql.DataSource;
-import org.apache.ibatis.jdbc.ScriptRunner;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
-import org.junit.runner.Runner;
import org.springframework.beans.factory.annotation.Autowired;
-
import org.springframework.boot.test.context.SpringBootTest;
-
-import org.springframework.boot.web.server.LocalServerPort;
import org.springframework.hateoas.hal.Jackson2HalModule;
-
import org.springframework.http.MediaType;
-
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.test.context.junit4.SpringRunner;
diff --git a/rest/taskana-rest-spring/src/main/java/pro/taskana/rest/ClassificationController.java b/rest/taskana-rest-spring/src/main/java/pro/taskana/rest/ClassificationController.java
index b4e4a1e1d..0ab88b977 100644
--- a/rest/taskana-rest-spring/src/main/java/pro/taskana/rest/ClassificationController.java
+++ b/rest/taskana-rest-spring/src/main/java/pro/taskana/rest/ClassificationController.java
@@ -35,8 +35,8 @@ import pro.taskana.exceptions.InvalidArgumentException;
import pro.taskana.exceptions.NotAuthorizedException;
import pro.taskana.rest.resource.ClassificationResource;
import pro.taskana.rest.resource.ClassificationSummaryResource;
-import pro.taskana.rest.resource.assembler.ClassificationResourceAssembler;
-import pro.taskana.rest.resource.assembler.ClassificationSummaryResourcesAssembler;
+import pro.taskana.rest.resource.ClassificationResourceAssembler;
+import pro.taskana.rest.resource.ClassificationSummaryResourcesAssembler;
/**
* Controller for all {@link Classification} related endpoints.
diff --git a/rest/taskana-rest-spring/src/main/java/pro/taskana/rest/ClassificationDefinitionController.java b/rest/taskana-rest-spring/src/main/java/pro/taskana/rest/ClassificationDefinitionController.java
index 4b240d31f..e1a566355 100644
--- a/rest/taskana-rest-spring/src/main/java/pro/taskana/rest/ClassificationDefinitionController.java
+++ b/rest/taskana-rest-spring/src/main/java/pro/taskana/rest/ClassificationDefinitionController.java
@@ -23,7 +23,7 @@ import pro.taskana.exceptions.DomainNotFoundException;
import pro.taskana.exceptions.InvalidArgumentException;
import pro.taskana.exceptions.NotAuthorizedException;
import pro.taskana.rest.resource.ClassificationResource;
-import pro.taskana.rest.resource.assembler.ClassificationResourceAssembler;
+import pro.taskana.rest.resource.ClassificationResourceAssembler;
import java.util.ArrayList;
import java.util.List;
diff --git a/rest/taskana-rest-spring/src/main/java/pro/taskana/rest/MonitorController.java b/rest/taskana-rest-spring/src/main/java/pro/taskana/rest/MonitorController.java
index 5d06ba8b0..efc27c250 100644
--- a/rest/taskana-rest-spring/src/main/java/pro/taskana/rest/MonitorController.java
+++ b/rest/taskana-rest-spring/src/main/java/pro/taskana/rest/MonitorController.java
@@ -22,7 +22,7 @@ import pro.taskana.impl.report.TimeIntervalColumnHeader;
import pro.taskana.monitor.ClassificationTimeIntervalColumnHeader;
import pro.taskana.monitor.WorkbasketTimeIntervalColumnHeader;
import pro.taskana.rest.resource.ReportResource;
-import pro.taskana.rest.resource.assembler.ReportAssembler;
+import pro.taskana.rest.resource.ReportAssembler;
/**
* Controller for all monitoring endpoints.
diff --git a/rest/taskana-rest-spring/src/main/java/pro/taskana/rest/TaskController.java b/rest/taskana-rest-spring/src/main/java/pro/taskana/rest/TaskController.java
index 30e7da2cc..b1a18d00a 100644
--- a/rest/taskana-rest-spring/src/main/java/pro/taskana/rest/TaskController.java
+++ b/rest/taskana-rest-spring/src/main/java/pro/taskana/rest/TaskController.java
@@ -43,8 +43,8 @@ import pro.taskana.exceptions.TaskNotFoundException;
import pro.taskana.exceptions.WorkbasketNotFoundException;
import pro.taskana.rest.resource.TaskResource;
import pro.taskana.rest.resource.TaskSummaryResource;
-import pro.taskana.rest.resource.assembler.TaskResourceAssembler;
-import pro.taskana.rest.resource.assembler.TaskSummaryResourcesAssembler;
+import pro.taskana.rest.resource.TaskResourceAssembler;
+import pro.taskana.rest.resource.TaskSummaryResourcesAssembler;
/**
* Controller for all {@link Task} related endpoints.
diff --git a/rest/taskana-rest-spring/src/main/java/pro/taskana/rest/WorkbasketAccessItemController.java b/rest/taskana-rest-spring/src/main/java/pro/taskana/rest/WorkbasketAccessItemController.java
index e98d78598..ba5e9a521 100644
--- a/rest/taskana-rest-spring/src/main/java/pro/taskana/rest/WorkbasketAccessItemController.java
+++ b/rest/taskana-rest-spring/src/main/java/pro/taskana/rest/WorkbasketAccessItemController.java
@@ -24,7 +24,7 @@ import pro.taskana.exceptions.InvalidArgumentException;
import pro.taskana.exceptions.NotAuthorizedException;
import pro.taskana.ldap.LdapClient;
import pro.taskana.rest.resource.WorkbasketAccessItemResource;
-import pro.taskana.rest.resource.assembler.WorkbasketAccessItemAssembler;
+import pro.taskana.rest.resource.WorkbasketAccessItemAssembler;
/**
* Controller for Workbasket access.
diff --git a/rest/taskana-rest-spring/src/main/java/pro/taskana/rest/WorkbasketController.java b/rest/taskana-rest-spring/src/main/java/pro/taskana/rest/WorkbasketController.java
index 721d3cd94..382e95cb9 100644
--- a/rest/taskana-rest-spring/src/main/java/pro/taskana/rest/WorkbasketController.java
+++ b/rest/taskana-rest-spring/src/main/java/pro/taskana/rest/WorkbasketController.java
@@ -44,11 +44,11 @@ import pro.taskana.rest.resource.DistributionTargetResource;
import pro.taskana.rest.resource.WorkbasketAccessItemResource;
import pro.taskana.rest.resource.WorkbasketResource;
import pro.taskana.rest.resource.WorkbasketSummaryResource;
-import pro.taskana.rest.resource.assembler.DistributionTargetListAssembler;
-import pro.taskana.rest.resource.assembler.WorkbasketAccessItemAssembler;
-import pro.taskana.rest.resource.assembler.WorkbasketAccessItemListAssembler;
-import pro.taskana.rest.resource.assembler.WorkbasketResourceAssembler;
-import pro.taskana.rest.resource.assembler.WorkbasketSummaryResourcesAssembler;
+import pro.taskana.rest.resource.DistributionTargetListAssembler;
+import pro.taskana.rest.resource.WorkbasketAccessItemAssembler;
+import pro.taskana.rest.resource.WorkbasketAccessItemListAssembler;
+import pro.taskana.rest.resource.WorkbasketResourceAssembler;
+import pro.taskana.rest.resource.WorkbasketSummaryResourcesAssembler;
/**
* Controller for all {@link Workbasket} related endpoints.
diff --git a/rest/taskana-rest-spring/src/main/java/pro/taskana/rest/WorkbasketDefinitionController.java b/rest/taskana-rest-spring/src/main/java/pro/taskana/rest/WorkbasketDefinitionController.java
index bc2438101..2e69d3b1c 100644
--- a/rest/taskana-rest-spring/src/main/java/pro/taskana/rest/WorkbasketDefinitionController.java
+++ b/rest/taskana-rest-spring/src/main/java/pro/taskana/rest/WorkbasketDefinitionController.java
@@ -26,9 +26,9 @@ import pro.taskana.exceptions.WorkbasketNotFoundException;
import pro.taskana.rest.resource.WorkbasketAccessItemResource;
import pro.taskana.rest.resource.WorkbasketDefinition;
import pro.taskana.rest.resource.WorkbasketResource;
-import pro.taskana.rest.resource.assembler.WorkbasketAccessItemAssembler;
-import pro.taskana.rest.resource.assembler.WorkbasketDefinitionAssembler;
-import pro.taskana.rest.resource.assembler.WorkbasketResourceAssembler;
+import pro.taskana.rest.resource.WorkbasketAccessItemAssembler;
+import pro.taskana.rest.resource.WorkbasketDefinitionAssembler;
+import pro.taskana.rest.resource.WorkbasketResourceAssembler;
import java.util.ArrayList;
import java.util.HashMap;
diff --git a/rest/taskana-rest-spring/src/main/java/pro/taskana/rest/resource/assembler/AbstractRessourcesAssembler.java b/rest/taskana-rest-spring/src/main/java/pro/taskana/rest/resource/AbstractRessourcesAssembler.java
similarity index 98%
rename from rest/taskana-rest-spring/src/main/java/pro/taskana/rest/resource/assembler/AbstractRessourcesAssembler.java
rename to rest/taskana-rest-spring/src/main/java/pro/taskana/rest/resource/AbstractRessourcesAssembler.java
index 3b27019cb..d52a2abd8 100644
--- a/rest/taskana-rest-spring/src/main/java/pro/taskana/rest/resource/assembler/AbstractRessourcesAssembler.java
+++ b/rest/taskana-rest-spring/src/main/java/pro/taskana/rest/resource/AbstractRessourcesAssembler.java
@@ -1,4 +1,4 @@
-package pro.taskana.rest.resource.assembler;
+package pro.taskana.rest.resource;
import java.util.Map;
diff --git a/rest/taskana-rest-spring/src/main/java/pro/taskana/rest/resource/assembler/AttachmentResourcesAssembler.java b/rest/taskana-rest-spring/src/main/java/pro/taskana/rest/resource/AttachmentResourcesAssembler.java
similarity index 95%
rename from rest/taskana-rest-spring/src/main/java/pro/taskana/rest/resource/assembler/AttachmentResourcesAssembler.java
rename to rest/taskana-rest-spring/src/main/java/pro/taskana/rest/resource/AttachmentResourcesAssembler.java
index 853b5ae67..2ec5b8e8d 100644
--- a/rest/taskana-rest-spring/src/main/java/pro/taskana/rest/resource/assembler/AttachmentResourcesAssembler.java
+++ b/rest/taskana-rest-spring/src/main/java/pro/taskana/rest/resource/AttachmentResourcesAssembler.java
@@ -1,4 +1,4 @@
-package pro.taskana.rest.resource.assembler;
+package pro.taskana.rest.resource;
import java.util.ArrayList;
import java.util.List;
@@ -10,7 +10,6 @@ import org.springframework.stereotype.Component;
import pro.taskana.Attachment;
import pro.taskana.TaskService;
import pro.taskana.impl.AttachmentImpl;
-import pro.taskana.rest.resource.AttachmentResource;
/**
* Resource assembler for {@link AttachmentResource}.
diff --git a/rest/taskana-rest-spring/src/main/java/pro/taskana/rest/resource/assembler/AttachmentSummaryResourceAssembler.java b/rest/taskana-rest-spring/src/main/java/pro/taskana/rest/resource/AttachmentSummaryResourceAssembler.java
similarity index 93%
rename from rest/taskana-rest-spring/src/main/java/pro/taskana/rest/resource/assembler/AttachmentSummaryResourceAssembler.java
rename to rest/taskana-rest-spring/src/main/java/pro/taskana/rest/resource/AttachmentSummaryResourceAssembler.java
index 55860a617..b2cb49742 100644
--- a/rest/taskana-rest-spring/src/main/java/pro/taskana/rest/resource/assembler/AttachmentSummaryResourceAssembler.java
+++ b/rest/taskana-rest-spring/src/main/java/pro/taskana/rest/resource/AttachmentSummaryResourceAssembler.java
@@ -1,4 +1,4 @@
-package pro.taskana.rest.resource.assembler;
+package pro.taskana.rest.resource;
import org.springframework.beans.BeanUtils;
import org.springframework.hateoas.mvc.ResourceAssemblerSupport;
@@ -6,7 +6,6 @@ import org.springframework.stereotype.Component;
import pro.taskana.AttachmentSummary;
import pro.taskana.rest.AttachmentController;
-import pro.taskana.rest.resource.AttachmentSummaryResource;
/**
* Resource assembler for {@link AttachmentSummaryResource}.
diff --git a/rest/taskana-rest-spring/src/main/java/pro/taskana/rest/resource/assembler/AttachmentSummaryResourcesAssembler.java b/rest/taskana-rest-spring/src/main/java/pro/taskana/rest/resource/AttachmentSummaryResourcesAssembler.java
similarity index 83%
rename from rest/taskana-rest-spring/src/main/java/pro/taskana/rest/resource/assembler/AttachmentSummaryResourcesAssembler.java
rename to rest/taskana-rest-spring/src/main/java/pro/taskana/rest/resource/AttachmentSummaryResourcesAssembler.java
index 1efb139a5..11e718edb 100644
--- a/rest/taskana-rest-spring/src/main/java/pro/taskana/rest/resource/assembler/AttachmentSummaryResourcesAssembler.java
+++ b/rest/taskana-rest-spring/src/main/java/pro/taskana/rest/resource/AttachmentSummaryResourcesAssembler.java
@@ -1,8 +1,7 @@
-package pro.taskana.rest.resource.assembler;
+package pro.taskana.rest.resource;
import java.util.List;
import pro.taskana.AttachmentSummary;
-import pro.taskana.rest.resource.AttachmentSummaryResource;
/**
* Resources assembler for {@link AttachmentSummaryResource}.
diff --git a/rest/taskana-rest-spring/src/main/java/pro/taskana/rest/resource/assembler/ClassificationResourceAssembler.java b/rest/taskana-rest-spring/src/main/java/pro/taskana/rest/resource/ClassificationResourceAssembler.java
similarity index 96%
rename from rest/taskana-rest-spring/src/main/java/pro/taskana/rest/resource/assembler/ClassificationResourceAssembler.java
rename to rest/taskana-rest-spring/src/main/java/pro/taskana/rest/resource/ClassificationResourceAssembler.java
index 938de9b3c..d3ffa8e4c 100644
--- a/rest/taskana-rest-spring/src/main/java/pro/taskana/rest/resource/assembler/ClassificationResourceAssembler.java
+++ b/rest/taskana-rest-spring/src/main/java/pro/taskana/rest/resource/ClassificationResourceAssembler.java
@@ -1,4 +1,4 @@
-package pro.taskana.rest.resource.assembler;
+package pro.taskana.rest.resource;
import static org.springframework.hateoas.mvc.ControllerLinkBuilder.linkTo;
import static org.springframework.hateoas.mvc.ControllerLinkBuilder.methodOn;
@@ -19,7 +19,6 @@ import pro.taskana.exceptions.InvalidArgumentException;
import pro.taskana.exceptions.NotAuthorizedException;
import pro.taskana.impl.ClassificationImpl;
import pro.taskana.rest.ClassificationController;
-import pro.taskana.rest.resource.ClassificationResource;
/**
* Transforms {@link Classification} to its resource counterpart {@link ClassificationResource} and vice versa.
diff --git a/rest/taskana-rest-spring/src/main/java/pro/taskana/rest/resource/assembler/ClassificationSummaryResourceAssembler.java b/rest/taskana-rest-spring/src/main/java/pro/taskana/rest/resource/ClassificationSummaryResourceAssembler.java
similarity index 94%
rename from rest/taskana-rest-spring/src/main/java/pro/taskana/rest/resource/assembler/ClassificationSummaryResourceAssembler.java
rename to rest/taskana-rest-spring/src/main/java/pro/taskana/rest/resource/ClassificationSummaryResourceAssembler.java
index 4e76287d1..b64cc3140 100644
--- a/rest/taskana-rest-spring/src/main/java/pro/taskana/rest/resource/assembler/ClassificationSummaryResourceAssembler.java
+++ b/rest/taskana-rest-spring/src/main/java/pro/taskana/rest/resource/ClassificationSummaryResourceAssembler.java
@@ -1,4 +1,4 @@
-package pro.taskana.rest.resource.assembler;
+package pro.taskana.rest.resource;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
@@ -9,7 +9,6 @@ import pro.taskana.ClassificationService;
import pro.taskana.ClassificationSummary;
import pro.taskana.impl.ClassificationImpl;
import pro.taskana.rest.ClassificationController;
-import pro.taskana.rest.resource.ClassificationSummaryResource;
/**
* Resource assembler for {@link ClassificationSummaryResource}.
diff --git a/rest/taskana-rest-spring/src/main/java/pro/taskana/rest/resource/assembler/ClassificationSummaryResourcesAssembler.java b/rest/taskana-rest-spring/src/main/java/pro/taskana/rest/resource/ClassificationSummaryResourcesAssembler.java
similarity index 91%
rename from rest/taskana-rest-spring/src/main/java/pro/taskana/rest/resource/assembler/ClassificationSummaryResourcesAssembler.java
rename to rest/taskana-rest-spring/src/main/java/pro/taskana/rest/resource/ClassificationSummaryResourcesAssembler.java
index ebdae07a4..04a71cdea 100644
--- a/rest/taskana-rest-spring/src/main/java/pro/taskana/rest/resource/assembler/ClassificationSummaryResourcesAssembler.java
+++ b/rest/taskana-rest-spring/src/main/java/pro/taskana/rest/resource/ClassificationSummaryResourcesAssembler.java
@@ -1,7 +1,7 @@
-package pro.taskana.rest.resource.assembler;
+package pro.taskana.rest.resource;
import static org.springframework.hateoas.mvc.ControllerLinkBuilder.linkTo;
-import static pro.taskana.rest.resource.assembler.AbstractRessourcesAssembler.getBuilderForOriginalUri;
+import static pro.taskana.rest.resource.AbstractRessourcesAssembler.getBuilderForOriginalUri;
import java.util.List;
@@ -12,7 +12,6 @@ import org.springframework.web.util.UriComponentsBuilder;
import pro.taskana.ClassificationSummary;
import pro.taskana.rest.ClassificationController;
-import pro.taskana.rest.resource.ClassificationSummaryResource;
/**
* @author HH
diff --git a/rest/taskana-rest-spring/src/main/java/pro/taskana/rest/resource/assembler/DistributionTargetListAssembler.java b/rest/taskana-rest-spring/src/main/java/pro/taskana/rest/resource/DistributionTargetListAssembler.java
similarity index 94%
rename from rest/taskana-rest-spring/src/main/java/pro/taskana/rest/resource/assembler/DistributionTargetListAssembler.java
rename to rest/taskana-rest-spring/src/main/java/pro/taskana/rest/resource/DistributionTargetListAssembler.java
index ad8177c54..56cfc0f65 100644
--- a/rest/taskana-rest-spring/src/main/java/pro/taskana/rest/resource/assembler/DistributionTargetListAssembler.java
+++ b/rest/taskana-rest-spring/src/main/java/pro/taskana/rest/resource/DistributionTargetListAssembler.java
@@ -1,4 +1,4 @@
-package pro.taskana.rest.resource.assembler;
+package pro.taskana.rest.resource;
import static org.springframework.hateoas.mvc.ControllerLinkBuilder.linkTo;
import static org.springframework.hateoas.mvc.ControllerLinkBuilder.methodOn;
@@ -15,7 +15,6 @@ import pro.taskana.WorkbasketSummary;
import pro.taskana.exceptions.NotAuthorizedException;
import pro.taskana.exceptions.WorkbasketNotFoundException;
import pro.taskana.rest.WorkbasketController;
-import pro.taskana.rest.resource.DistributionTargetResource;
/**
* Mapper to convert from a list of WorkbasketSummary to a workbasket list resource.
diff --git a/rest/taskana-rest-spring/src/main/java/pro/taskana/rest/resource/assembler/DistributionTargetResourceAssembler.java b/rest/taskana-rest-spring/src/main/java/pro/taskana/rest/resource/DistributionTargetResourceAssembler.java
similarity index 92%
rename from rest/taskana-rest-spring/src/main/java/pro/taskana/rest/resource/assembler/DistributionTargetResourceAssembler.java
rename to rest/taskana-rest-spring/src/main/java/pro/taskana/rest/resource/DistributionTargetResourceAssembler.java
index 83105a7e9..160393894 100644
--- a/rest/taskana-rest-spring/src/main/java/pro/taskana/rest/resource/assembler/DistributionTargetResourceAssembler.java
+++ b/rest/taskana-rest-spring/src/main/java/pro/taskana/rest/resource/DistributionTargetResourceAssembler.java
@@ -1,4 +1,4 @@
-package pro.taskana.rest.resource.assembler;
+package pro.taskana.rest.resource;
import static org.springframework.hateoas.mvc.ControllerLinkBuilder.linkTo;
import static org.springframework.hateoas.mvc.ControllerLinkBuilder.methodOn;
@@ -10,7 +10,6 @@ import pro.taskana.WorkbasketSummary;
import pro.taskana.exceptions.NotAuthorizedException;
import pro.taskana.exceptions.WorkbasketNotFoundException;
import pro.taskana.rest.WorkbasketController;
-import pro.taskana.rest.resource.DistributionTargetResource;
/**
* Transforms WorkbasketSummary to its resource counterpart DistributionTargerResource and vice versa.
diff --git a/rest/taskana-rest-spring/src/main/java/pro/taskana/rest/resource/assembler/ReportAssembler.java b/rest/taskana-rest-spring/src/main/java/pro/taskana/rest/resource/ReportAssembler.java
similarity index 97%
rename from rest/taskana-rest-spring/src/main/java/pro/taskana/rest/resource/assembler/ReportAssembler.java
rename to rest/taskana-rest-spring/src/main/java/pro/taskana/rest/resource/ReportAssembler.java
index 57e6a98ef..4c9db6dae 100644
--- a/rest/taskana-rest-spring/src/main/java/pro/taskana/rest/resource/assembler/ReportAssembler.java
+++ b/rest/taskana-rest-spring/src/main/java/pro/taskana/rest/resource/ReportAssembler.java
@@ -1,4 +1,4 @@
-package pro.taskana.rest.resource.assembler;
+package pro.taskana.rest.resource;
import static org.springframework.hateoas.mvc.ControllerLinkBuilder.linkTo;
import static org.springframework.hateoas.mvc.ControllerLinkBuilder.methodOn;
@@ -23,7 +23,6 @@ import pro.taskana.report.ClassificationReport;
import pro.taskana.report.WorkbasketReport;
import pro.taskana.rest.MonitorController;
-import pro.taskana.rest.resource.ReportResource;
/**
* Transforms any {@link Report} into its {@link ReportResource}.
diff --git a/rest/taskana-rest-spring/src/main/java/pro/taskana/rest/resource/assembler/TaskResourceAssembler.java b/rest/taskana-rest-spring/src/main/java/pro/taskana/rest/resource/TaskResourceAssembler.java
similarity index 99%
rename from rest/taskana-rest-spring/src/main/java/pro/taskana/rest/resource/assembler/TaskResourceAssembler.java
rename to rest/taskana-rest-spring/src/main/java/pro/taskana/rest/resource/TaskResourceAssembler.java
index 654744184..b2c6d84b6 100644
--- a/rest/taskana-rest-spring/src/main/java/pro/taskana/rest/resource/assembler/TaskResourceAssembler.java
+++ b/rest/taskana-rest-spring/src/main/java/pro/taskana/rest/resource/TaskResourceAssembler.java
@@ -1,4 +1,4 @@
-package pro.taskana.rest.resource.assembler;
+package pro.taskana.rest.resource;
import java.time.Instant;
import java.util.Objects;
@@ -15,7 +15,6 @@ import pro.taskana.exceptions.InvalidArgumentException;
import pro.taskana.exceptions.SystemException;
import pro.taskana.impl.TaskImpl;
import pro.taskana.rest.TaskController;
-import pro.taskana.rest.resource.TaskResource;
/**
* Resource assembler for {@link TaskResource}.
diff --git a/rest/taskana-rest-spring/src/main/java/pro/taskana/rest/resource/assembler/TaskSummaryResourceAssembler.java b/rest/taskana-rest-spring/src/main/java/pro/taskana/rest/resource/TaskSummaryResourceAssembler.java
similarity index 97%
rename from rest/taskana-rest-spring/src/main/java/pro/taskana/rest/resource/assembler/TaskSummaryResourceAssembler.java
rename to rest/taskana-rest-spring/src/main/java/pro/taskana/rest/resource/TaskSummaryResourceAssembler.java
index 1ccdc10cf..23a644a05 100644
--- a/rest/taskana-rest-spring/src/main/java/pro/taskana/rest/resource/assembler/TaskSummaryResourceAssembler.java
+++ b/rest/taskana-rest-spring/src/main/java/pro/taskana/rest/resource/TaskSummaryResourceAssembler.java
@@ -1,4 +1,4 @@
-package pro.taskana.rest.resource.assembler;
+package pro.taskana.rest.resource;
import org.springframework.beans.BeanUtils;
import org.springframework.hateoas.mvc.ResourceAssemblerSupport;
@@ -7,7 +7,6 @@ import pro.taskana.TaskSummary;
import pro.taskana.exceptions.InvalidArgumentException;
import pro.taskana.exceptions.SystemException;
import pro.taskana.rest.TaskController;
-import pro.taskana.rest.resource.TaskSummaryResource;
/**
* Resource assembler for {@link TaskSummaryResource}.
diff --git a/rest/taskana-rest-spring/src/main/java/pro/taskana/rest/resource/assembler/TaskSummaryResourcesAssembler.java b/rest/taskana-rest-spring/src/main/java/pro/taskana/rest/resource/TaskSummaryResourcesAssembler.java
similarity index 92%
rename from rest/taskana-rest-spring/src/main/java/pro/taskana/rest/resource/assembler/TaskSummaryResourcesAssembler.java
rename to rest/taskana-rest-spring/src/main/java/pro/taskana/rest/resource/TaskSummaryResourcesAssembler.java
index 861afa20a..e0ad8108b 100644
--- a/rest/taskana-rest-spring/src/main/java/pro/taskana/rest/resource/assembler/TaskSummaryResourcesAssembler.java
+++ b/rest/taskana-rest-spring/src/main/java/pro/taskana/rest/resource/TaskSummaryResourcesAssembler.java
@@ -1,4 +1,4 @@
-package pro.taskana.rest.resource.assembler;
+package pro.taskana.rest.resource;
import static org.springframework.hateoas.mvc.ControllerLinkBuilder.linkTo;
@@ -10,7 +10,6 @@ import org.springframework.hateoas.PagedResources.PageMetadata;
import pro.taskana.TaskSummary;
import pro.taskana.rest.TaskController;
-import pro.taskana.rest.resource.TaskSummaryResource;
/**
* Resources assembler for {@link TaskSummaryResource}.
diff --git a/rest/taskana-rest-spring/src/main/java/pro/taskana/rest/resource/assembler/WorkbasketAccessItemAssembler.java b/rest/taskana-rest-spring/src/main/java/pro/taskana/rest/resource/WorkbasketAccessItemAssembler.java
similarity index 94%
rename from rest/taskana-rest-spring/src/main/java/pro/taskana/rest/resource/assembler/WorkbasketAccessItemAssembler.java
rename to rest/taskana-rest-spring/src/main/java/pro/taskana/rest/resource/WorkbasketAccessItemAssembler.java
index b2e6ac844..a8e126373 100644
--- a/rest/taskana-rest-spring/src/main/java/pro/taskana/rest/resource/assembler/WorkbasketAccessItemAssembler.java
+++ b/rest/taskana-rest-spring/src/main/java/pro/taskana/rest/resource/WorkbasketAccessItemAssembler.java
@@ -1,8 +1,8 @@
-package pro.taskana.rest.resource.assembler;
+package pro.taskana.rest.resource;
import static org.springframework.hateoas.mvc.ControllerLinkBuilder.linkTo;
import static org.springframework.hateoas.mvc.ControllerLinkBuilder.methodOn;
-import static pro.taskana.rest.resource.assembler.AbstractRessourcesAssembler.getBuilderForOriginalUri;
+import static pro.taskana.rest.resource.AbstractRessourcesAssembler.getBuilderForOriginalUri;
import java.util.List;
@@ -19,7 +19,6 @@ import pro.taskana.exceptions.NotAuthorizedException;
import pro.taskana.exceptions.WorkbasketNotFoundException;
import pro.taskana.impl.WorkbasketAccessItemImpl;
import pro.taskana.rest.WorkbasketController;
-import pro.taskana.rest.resource.WorkbasketAccessItemResource;
/**
* Transforms {@link WorkbasketAccessItem} to its resource counterpart {@link WorkbasketAccessItemResource} and vice
diff --git a/rest/taskana-rest-spring/src/main/java/pro/taskana/rest/resource/assembler/WorkbasketAccessItemListAssembler.java b/rest/taskana-rest-spring/src/main/java/pro/taskana/rest/resource/WorkbasketAccessItemListAssembler.java
similarity index 94%
rename from rest/taskana-rest-spring/src/main/java/pro/taskana/rest/resource/assembler/WorkbasketAccessItemListAssembler.java
rename to rest/taskana-rest-spring/src/main/java/pro/taskana/rest/resource/WorkbasketAccessItemListAssembler.java
index 8f3d59db4..e65063b4d 100644
--- a/rest/taskana-rest-spring/src/main/java/pro/taskana/rest/resource/assembler/WorkbasketAccessItemListAssembler.java
+++ b/rest/taskana-rest-spring/src/main/java/pro/taskana/rest/resource/WorkbasketAccessItemListAssembler.java
@@ -1,4 +1,4 @@
-package pro.taskana.rest.resource.assembler;
+package pro.taskana.rest.resource;
import static org.springframework.hateoas.mvc.ControllerLinkBuilder.linkTo;
import static org.springframework.hateoas.mvc.ControllerLinkBuilder.methodOn;
@@ -15,7 +15,6 @@ import pro.taskana.WorkbasketAccessItem;
import pro.taskana.exceptions.NotAuthorizedException;
import pro.taskana.exceptions.WorkbasketNotFoundException;
import pro.taskana.rest.WorkbasketController;
-import pro.taskana.rest.resource.WorkbasketAccessItemResource;
/**
* Mapper to convert from a list of WorkbasketAccessItem to a WorkbasketAccessItemResource.
diff --git a/rest/taskana-rest-spring/src/main/java/pro/taskana/rest/resource/assembler/WorkbasketAccessItemsAssembler.java b/rest/taskana-rest-spring/src/main/java/pro/taskana/rest/resource/WorkbasketAccessItemsAssembler.java
similarity index 90%
rename from rest/taskana-rest-spring/src/main/java/pro/taskana/rest/resource/assembler/WorkbasketAccessItemsAssembler.java
rename to rest/taskana-rest-spring/src/main/java/pro/taskana/rest/resource/WorkbasketAccessItemsAssembler.java
index cb607222d..69828a12d 100644
--- a/rest/taskana-rest-spring/src/main/java/pro/taskana/rest/resource/assembler/WorkbasketAccessItemsAssembler.java
+++ b/rest/taskana-rest-spring/src/main/java/pro/taskana/rest/resource/WorkbasketAccessItemsAssembler.java
@@ -1,11 +1,10 @@
-package pro.taskana.rest.resource.assembler;
+package pro.taskana.rest.resource;
import org.springframework.beans.BeanUtils;
import org.springframework.hateoas.mvc.ResourceAssemblerSupport;
import pro.taskana.WorkbasketAccessItem;
import pro.taskana.rest.WorkbasketAccessItemController;
-import pro.taskana.rest.resource.WorkbasketAccessItemResource;
/**
* Mapper to convert from a list of WorkbasketAccessItem to a WorkbasketAccessItemResource.
diff --git a/rest/taskana-rest-spring/src/main/java/pro/taskana/rest/resource/assembler/WorkbasketDefinitionAssembler.java b/rest/taskana-rest-spring/src/main/java/pro/taskana/rest/resource/WorkbasketDefinitionAssembler.java
similarity index 94%
rename from rest/taskana-rest-spring/src/main/java/pro/taskana/rest/resource/assembler/WorkbasketDefinitionAssembler.java
rename to rest/taskana-rest-spring/src/main/java/pro/taskana/rest/resource/WorkbasketDefinitionAssembler.java
index 8821f8319..48af64630 100644
--- a/rest/taskana-rest-spring/src/main/java/pro/taskana/rest/resource/assembler/WorkbasketDefinitionAssembler.java
+++ b/rest/taskana-rest-spring/src/main/java/pro/taskana/rest/resource/WorkbasketDefinitionAssembler.java
@@ -1,4 +1,4 @@
-package pro.taskana.rest.resource.assembler;
+package pro.taskana.rest.resource;
import static org.springframework.hateoas.mvc.ControllerLinkBuilder.linkTo;
import static org.springframework.hateoas.mvc.ControllerLinkBuilder.methodOn;
@@ -19,8 +19,6 @@ import pro.taskana.WorkbasketSummary;
import pro.taskana.exceptions.NotAuthorizedException;
import pro.taskana.exceptions.WorkbasketNotFoundException;
import pro.taskana.rest.WorkbasketDefinitionController;
-import pro.taskana.rest.resource.WorkbasketAccessItemResource;
-import pro.taskana.rest.resource.WorkbasketDefinition;
/**
* Transforms {@link Workbasket} into a {@link WorkbasketDefinition}
diff --git a/rest/taskana-rest-spring/src/main/java/pro/taskana/rest/resource/assembler/WorkbasketResourceAssembler.java b/rest/taskana-rest-spring/src/main/java/pro/taskana/rest/resource/WorkbasketResourceAssembler.java
similarity index 96%
rename from rest/taskana-rest-spring/src/main/java/pro/taskana/rest/resource/assembler/WorkbasketResourceAssembler.java
rename to rest/taskana-rest-spring/src/main/java/pro/taskana/rest/resource/WorkbasketResourceAssembler.java
index b36ce235b..93fb5e29d 100644
--- a/rest/taskana-rest-spring/src/main/java/pro/taskana/rest/resource/assembler/WorkbasketResourceAssembler.java
+++ b/rest/taskana-rest-spring/src/main/java/pro/taskana/rest/resource/WorkbasketResourceAssembler.java
@@ -1,4 +1,4 @@
-package pro.taskana.rest.resource.assembler;
+package pro.taskana.rest.resource;
import static org.springframework.hateoas.mvc.ControllerLinkBuilder.linkTo;
import static org.springframework.hateoas.mvc.ControllerLinkBuilder.methodOn;
@@ -15,7 +15,6 @@ import pro.taskana.exceptions.NotAuthorizedException;
import pro.taskana.exceptions.WorkbasketNotFoundException;
import pro.taskana.impl.WorkbasketImpl;
import pro.taskana.rest.WorkbasketController;
-import pro.taskana.rest.resource.WorkbasketResource;
/**
* Transforms {@link Workbasket} to its resource counterpart {@link WorkbasketResource} and vice versa.
diff --git a/rest/taskana-rest-spring/src/main/java/pro/taskana/rest/resource/assembler/WorkbasketSummaryResourceAssembler.java b/rest/taskana-rest-spring/src/main/java/pro/taskana/rest/resource/WorkbasketSummaryResourceAssembler.java
similarity index 93%
rename from rest/taskana-rest-spring/src/main/java/pro/taskana/rest/resource/assembler/WorkbasketSummaryResourceAssembler.java
rename to rest/taskana-rest-spring/src/main/java/pro/taskana/rest/resource/WorkbasketSummaryResourceAssembler.java
index 5c0f50e00..9ff17eeef 100644
--- a/rest/taskana-rest-spring/src/main/java/pro/taskana/rest/resource/assembler/WorkbasketSummaryResourceAssembler.java
+++ b/rest/taskana-rest-spring/src/main/java/pro/taskana/rest/resource/WorkbasketSummaryResourceAssembler.java
@@ -1,4 +1,4 @@
-package pro.taskana.rest.resource.assembler;
+package pro.taskana.rest.resource;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
@@ -9,7 +9,6 @@ import pro.taskana.WorkbasketService;
import pro.taskana.WorkbasketSummary;
import pro.taskana.impl.WorkbasketImpl;
import pro.taskana.rest.WorkbasketController;
-import pro.taskana.rest.resource.WorkbasketSummaryResource;
/**
* @author HH
diff --git a/rest/taskana-rest-spring/src/main/java/pro/taskana/rest/resource/assembler/WorkbasketSummaryResourcesAssembler.java b/rest/taskana-rest-spring/src/main/java/pro/taskana/rest/resource/WorkbasketSummaryResourcesAssembler.java
similarity index 88%
rename from rest/taskana-rest-spring/src/main/java/pro/taskana/rest/resource/assembler/WorkbasketSummaryResourcesAssembler.java
rename to rest/taskana-rest-spring/src/main/java/pro/taskana/rest/resource/WorkbasketSummaryResourcesAssembler.java
index 0bcde6644..1960b3bd2 100644
--- a/rest/taskana-rest-spring/src/main/java/pro/taskana/rest/resource/assembler/WorkbasketSummaryResourcesAssembler.java
+++ b/rest/taskana-rest-spring/src/main/java/pro/taskana/rest/resource/WorkbasketSummaryResourcesAssembler.java
@@ -1,7 +1,6 @@
-package pro.taskana.rest.resource.assembler;
+package pro.taskana.rest.resource;
import static org.springframework.hateoas.mvc.ControllerLinkBuilder.linkTo;
-import static pro.taskana.rest.resource.assembler.AbstractRessourcesAssembler.getBuilderForOriginalUri;
import java.util.List;
@@ -12,7 +11,6 @@ import org.springframework.web.util.UriComponentsBuilder;
import pro.taskana.WorkbasketSummary;
import pro.taskana.rest.WorkbasketController;
-import pro.taskana.rest.resource.WorkbasketSummaryResource;
/**
* @author HH
@@ -31,7 +29,7 @@ public class WorkbasketSummaryResourcesAssembler {
resources,
pageMetadata);
- UriComponentsBuilder original = getBuilderForOriginalUri();
+ UriComponentsBuilder original = AbstractRessourcesAssembler.getBuilderForOriginalUri();
pagedResources.add(new Link(original.toUriString()).withSelfRel());
if (pageMetadata != null) {
pagedResources.add(linkTo(WorkbasketController.class).withRel("allWorkbaskets"));
diff --git a/rest/taskana-rest-spring/src/test/java/pro/taskana/rest/resource/assembler/ClassificationAssemblerTest.java b/rest/taskana-rest-spring/src/test/java/pro/taskana/rest/resource/ClassificationAssemblerTest.java
similarity index 98%
rename from rest/taskana-rest-spring/src/test/java/pro/taskana/rest/resource/assembler/ClassificationAssemblerTest.java
rename to rest/taskana-rest-spring/src/test/java/pro/taskana/rest/resource/ClassificationAssemblerTest.java
index d645426b5..911f43a35 100644
--- a/rest/taskana-rest-spring/src/test/java/pro/taskana/rest/resource/assembler/ClassificationAssemblerTest.java
+++ b/rest/taskana-rest-spring/src/test/java/pro/taskana/rest/resource/ClassificationAssemblerTest.java
@@ -1,4 +1,4 @@
-package pro.taskana.rest.resource.assembler;
+package pro.taskana.rest.resource;
import java.time.Instant;
@@ -20,7 +20,6 @@ import pro.taskana.exceptions.InvalidArgumentException;
import pro.taskana.exceptions.NotAuthorizedException;
import pro.taskana.impl.ClassificationImpl;
import pro.taskana.rest.TestConfiguration;
-import pro.taskana.rest.resource.ClassificationResource;
/**
* Test for {@link ClassificationResourceAssembler}.
diff --git a/rest/taskana-rest-spring/src/test/java/pro/taskana/rest/resource/assembler/WorkbasketAccessItemAssemblerTest.java b/rest/taskana-rest-spring/src/test/java/pro/taskana/rest/resource/WorkbasketAccessItemAssemblerTest.java
similarity index 97%
rename from rest/taskana-rest-spring/src/test/java/pro/taskana/rest/resource/assembler/WorkbasketAccessItemAssemblerTest.java
rename to rest/taskana-rest-spring/src/test/java/pro/taskana/rest/resource/WorkbasketAccessItemAssemblerTest.java
index 48c45e0e9..69e06ef7a 100644
--- a/rest/taskana-rest-spring/src/test/java/pro/taskana/rest/resource/assembler/WorkbasketAccessItemAssemblerTest.java
+++ b/rest/taskana-rest-spring/src/test/java/pro/taskana/rest/resource/WorkbasketAccessItemAssemblerTest.java
@@ -1,4 +1,4 @@
-package pro.taskana.rest.resource.assembler;
+package pro.taskana.rest.resource;
import org.junit.Assert;
import org.junit.Test;
@@ -14,7 +14,6 @@ import pro.taskana.exceptions.NotAuthorizedException;
import pro.taskana.exceptions.WorkbasketNotFoundException;
import pro.taskana.impl.WorkbasketAccessItemImpl;
import pro.taskana.rest.TestConfiguration;
-import pro.taskana.rest.resource.WorkbasketAccessItemResource;
/**
* Test for {@link WorkbasketAccessItemAssembler}.
diff --git a/rest/taskana-rest-spring/src/test/java/pro/taskana/rest/resource/assembler/WorkbasketResourceAssemblerTest.java b/rest/taskana-rest-spring/src/test/java/pro/taskana/rest/resource/WorkbasketResourceAssemblerTest.java
similarity index 98%
rename from rest/taskana-rest-spring/src/test/java/pro/taskana/rest/resource/assembler/WorkbasketResourceAssemblerTest.java
rename to rest/taskana-rest-spring/src/test/java/pro/taskana/rest/resource/WorkbasketResourceAssemblerTest.java
index 2df00192b..4968e918d 100644
--- a/rest/taskana-rest-spring/src/test/java/pro/taskana/rest/resource/assembler/WorkbasketResourceAssemblerTest.java
+++ b/rest/taskana-rest-spring/src/test/java/pro/taskana/rest/resource/WorkbasketResourceAssemblerTest.java
@@ -1,4 +1,4 @@
-package pro.taskana.rest.resource.assembler;
+package pro.taskana.rest.resource;
import java.time.Instant;
@@ -17,7 +17,6 @@ import pro.taskana.exceptions.NotAuthorizedException;
import pro.taskana.exceptions.WorkbasketNotFoundException;
import pro.taskana.impl.WorkbasketImpl;
import pro.taskana.rest.TestConfiguration;
-import pro.taskana.rest.resource.WorkbasketResource;
/**
* Test for {@link WorkbasketResourceAssembler}.
diff --git a/rest/taskana-rest-spring/src/test/java/pro/taskana/rest/resource/assembler/WorkbasketSummaryAssemblerTest.java b/rest/taskana-rest-spring/src/test/java/pro/taskana/rest/resource/WorkbasketSummaryAssemblerTest.java
similarity index 96%
rename from rest/taskana-rest-spring/src/test/java/pro/taskana/rest/resource/assembler/WorkbasketSummaryAssemblerTest.java
rename to rest/taskana-rest-spring/src/test/java/pro/taskana/rest/resource/WorkbasketSummaryAssemblerTest.java
index 228ab711d..0835b200e 100644
--- a/rest/taskana-rest-spring/src/test/java/pro/taskana/rest/resource/assembler/WorkbasketSummaryAssemblerTest.java
+++ b/rest/taskana-rest-spring/src/test/java/pro/taskana/rest/resource/WorkbasketSummaryAssemblerTest.java
@@ -1,4 +1,4 @@
-package pro.taskana.rest.resource.assembler;
+package pro.taskana.rest.resource;
import org.junit.Assert;
import org.junit.Test;
@@ -12,7 +12,6 @@ import pro.taskana.WorkbasketService;
import pro.taskana.WorkbasketType;
import pro.taskana.impl.WorkbasketSummaryImpl;
import pro.taskana.rest.TestConfiguration;
-import pro.taskana.rest.resource.WorkbasketSummaryResource;
/**
* Test for {@link WorkbasketSummaryResourceAssembler}.
diff --git a/rest/taskana-rest-spring/src/test/resources/application.properties b/rest/taskana-rest-spring/src/test/resources/application.properties
new file mode 100644
index 000000000..4da1feb99
--- /dev/null
+++ b/rest/taskana-rest-spring/src/test/resources/application.properties
@@ -0,0 +1 @@
+logging.level.pro.taskana=INFO