feature/810 Add querying by planned date in monitor screen

This commit is contained in:
Martin Rojas Miguel Angel 2019-03-13 17:00:55 +01:00 committed by Holger Hagen
parent ab4458a2c7
commit aea64975db
64 changed files with 1017 additions and 1366 deletions

View File

@ -18,15 +18,21 @@
<version>2.0.2.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<!-- Repository for postgresql V. 9.4.1212 driver.
<repositories>
<repository>
<id>postgresql</id>
<name>postgresql repository</name>
<url>https://mvnrepository.com/artifact/postgresql/postgresql</url>
</repository>
</repositories>
-->
<repositories>
<!-- Repository for postgresql V. 9.4.1212 driver.
<repository>
<id>postgresql</id>
<name>postgresql repository</name>
<url>https://mvnrepository.com/artifact/postgresql/postgresql</url>
</repository>-->
<!-- this repository is needed to fetch com.ibm.db2.jcc -->
<repository>
<id>novatec public</id>
<name>novatec-repository</name>
<url>https://repository.novatec-gmbh.de/content/repositories/novatec/</url>
</repository>
</repositories>
<profiles>
<profile>
@ -84,14 +90,12 @@
<version>11.1.1.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/postgresql/postgresql -->
<!-- Postgresql driver dependency
<!-- Postgresql driver dependency -->
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<version>9.4.1212</version>
</dependency>
-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
@ -159,15 +163,4 @@
</plugin>
</plugins>
</build>
<!--
this repository is needed to fetch com.ibm.db2.jcc
-->
<repositories>
<repository>
<id>novatec public</id>
<name>novatec-repository</name>
<url>https://repository.novatec-gmbh.de/content/repositories/novatec/</url>
</repository>
</repositories>
</project>

View File

@ -9,13 +9,10 @@ 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.scheduling.annotation.EnableScheduling;
import org.springframework.transaction.PlatformTransactionManager;
@ -53,20 +50,6 @@ public class ExampleRestApplication {
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);

View File

@ -2,23 +2,25 @@ logging.level.pro.taskana=INFO
### logging.level.org.springframework=DEBUG
######## Taskana DB #######
######## h2 configuration ########
datasource.url=jdbc:h2:mem:taskana;IGNORECASE=TRUE;LOCK_MODE=0
datasource.driverClassName=org.h2.Driver
datasource.username=sa
datasource.password=sa
spring.datasource.url=jdbc:h2:mem:taskana;IGNORECASE=TRUE;LOCK_MODE=0
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=sa
taskana.schemaName=TASKANA
######## h2 console configuration ########
######## spring.h2.console.enabled=true ########
######## spring.h2.console.path=/h2-console ########
########spring.h2.console.enabled=true
########spring.h2.console.path=/h2-console
######## Postgres configuration ########
######## datasource.url=jdbc:postgresql://localhost/taskana ########
######## datasource.driverClassName=org.postgresql.Driver ########
######## datasource.username=postgres ########
######## datasource.password=1234 ########
########spring.datasource.url=jdbc:postgresql://localhost/taskana
########spring.datasource.driverClassName=org.postgresql.Driver
########spring.datasource.username=postgres
########spring.datasource.password=1234
########spring.jpa.generate-ddl=true
########spring.jpa.properties.hibernate.jdbc.lob.non_contextual_creation=true
####### property that control rest api security deploy use true for no security.
devMode=false
####### property that control if the database is cleaned and sample data is generated
generateSampleData=true

View File

@ -70,7 +70,6 @@ public class AbstractPagingControllerRestDocumentation {
pagingFieldDescriptionsMap.put("page.totalElements", "Total number of items");
pagingFieldDescriptionsMap.put("page.totalPages", "Number of pages");
pagingFieldDescriptionsMap.put("page.number", "Current page number");
pagingFieldDescriptionsMap.put("_links.allClassifications.href", "Link to the main Summary-Resourc");
pagingFieldDescriptionsMap.put("_links.first.href", "Link to first page");
pagingFieldDescriptionsMap.put("_links.last.href", "Link to last page");
pagingFieldDescriptionsMap.put("_links.prev.href", "Link to previous page");
@ -87,7 +86,6 @@ public class AbstractPagingControllerRestDocumentation {
fieldWithPath("page.totalElements").description(pagingFieldDescriptionsMap.get("page.totalElements")),
fieldWithPath("page.totalPages").description(pagingFieldDescriptionsMap.get("page.totalPages")),
fieldWithPath("page.number").description(pagingFieldDescriptionsMap.get("page.number")),
fieldWithPath("_links.allClassifications.href").description(pagingFieldDescriptionsMap.get("_links.allClassifications.href")),
fieldWithPath("_links.first.href").description(pagingFieldDescriptionsMap.get("_links.first.href")),
fieldWithPath("_links.last.href").description(pagingFieldDescriptionsMap.get("_links.last.href")),
fieldWithPath("_links.prev.href").description(pagingFieldDescriptionsMap.get("_links.prev.href")),

View File

@ -247,23 +247,21 @@ public class WorkbasketControllerRestDocumentation {
accessItemFieldDescriptionsMap.get("_embedded.accessItems.permCustom11")),
fieldWithPath("_embedded.accessItems[].permCustom12").description(
accessItemFieldDescriptionsMap.get("_embedded.accessItems.permCustom12")),
fieldWithPath("_embedded.accessItems[]._links.workbasket.href").description(
accessItemFieldDescriptionsMap.get("_embedded.accessItems._links.workbasket.href")),
fieldWithPath("_links.self.href").ignored(),
fieldWithPath("_links.workbasket.href").ignored()
};
allWorkbasketAccessItemsFieldDescriptors = new FieldDescriptor[] {
subsectionWithPath("_embedded.accessItems").description("An array of <<access-item, Access Items>>"),
fieldWithPath("_links.workbasket.href").description("Link to the workbasket"),
fieldWithPath("_links.self.href").ignored()
fieldWithPath("_links.self.href").ignored(),
fieldWithPath("_links.workbasket.href").ignored()
};
allDistributionTargetsFieldDescriptors = new FieldDescriptor[] {
subsectionWithPath("_embedded.distributionTargets").description(
"An array of <<workbasket-subset, workbasket subsets>>"),
fieldWithPath("_links.workbasket.href").description("Link to the workbasket"),
fieldWithPath("_links.self.href").ignored()
fieldWithPath("_links.self.href").ignored(),
fieldWithPath("_links.workbasket.href").ignored()
};
createWorkbasketFieldDescriptors = new FieldDescriptor[] {

View File

@ -130,11 +130,6 @@ public class ClassificationControllerIntTest {
.getLink(Link.REL_SELF)
.getHref()
.endsWith("/v1/classifications?domain=DOMAIN_A&sort-by=key&order=asc&page=2&page-size=5"));
assertNotNull(response.getBody().getLink("allClassifications"));
assertTrue(response.getBody()
.getLink("allClassifications")
.getHref()
.endsWith("/v1/classifications"));
assertNotNull(response.getBody().getLink(Link.REL_FIRST));
assertNotNull(response.getBody().getLink(Link.REL_LAST));
assertNotNull(response.getBody().getLink(Link.REL_NEXT));

View File

@ -221,11 +221,6 @@ public class TaskControllerIntTest {
.getLink(Link.REL_SELF)
.getHref()
.endsWith("/v1/tasks?state=READY,CLAIMED&sort-by=por.value&order=desc&page=15&page-size=5"));
assertNotNull(response.getBody().getLink("allTasks"));
assertTrue(response.getBody()
.getLink("allTasks")
.getHref()
.endsWith("/v1/tasks"));
assertNotNull(response.getBody().getLink(Link.REL_FIRST));
assertNotNull(response.getBody().getLink(Link.REL_LAST));
assertNotNull(response.getBody().getLink(Link.REL_PREVIOUS));
@ -263,11 +258,6 @@ public class TaskControllerIntTest {
.getLink(Link.REL_SELF)
.getHref()
.endsWith("/v1/tasks?sort-by=due&order=desc&page=5&page-size=5"));
assertNotNull(response.getBody().getLink("allTasks"));
assertTrue(response.getBody()
.getLink("allTasks")
.getHref()
.endsWith("/v1/tasks"));
assertNotNull(response.getBody().getLink(Link.REL_FIRST));
assertNotNull(response.getBody().getLink(Link.REL_LAST));
assertNotNull(response.getBody().getLink(Link.REL_PREVIOUS));
@ -298,11 +288,6 @@ public class TaskControllerIntTest {
.getHref()
.endsWith(
"/v1/tasks?por.company=00&por.system=PASystem&por.instance=00&por.type=VNR&por.value=22334455&sort-by=por.type&order=asc&page=2&page-size=5"));
assertNotNull(response.getBody().getLink("allTasks"));
assertTrue(response.getBody()
.getLink("allTasks")
.getHref()
.endsWith("/v1/tasks"));
assertNotNull(response.getBody().getLink(Link.REL_FIRST));
assertNotNull(response.getBody().getLink(Link.REL_LAST));
assertNotNull(response.getBody().getLink(Link.REL_PREVIOUS));

View File

@ -70,7 +70,7 @@ public class WorkbasketAccessItemControllerIntTest {
@Test
public void testGetWorkbasketAccessItemsKeepingFilters() {
String parameters = "/v1/workbasket-access-items/?sort-by=workbasket-key&order=asc&page=1&page-size=9&access-ids=user_1_1";
String parameters = "/v1/workbasket-access-items?sort-by=workbasket-key&order=asc&page=1&page-size=9&access-ids=user_1_1";
ResponseEntity<PagedResources<WorkbasketAccessItemResource>> response = template.exchange(
url + port + parameters, HttpMethod.GET, request,
new ParameterizedTypeReference<PagedResources<WorkbasketAccessItemResource>>() {
@ -100,7 +100,7 @@ public class WorkbasketAccessItemControllerIntTest {
@Test
public void testGetSecondPageSortedByWorkbasketKey() {
String parameters = "/v1/workbasket-access-items/?sort-by=workbasket-key&order=asc&page=2&page-size=9&access-ids=user_1_1";
String parameters = "/v1/workbasket-access-items?sort-by=workbasket-key&order=asc&page=2&page-size=9&access-ids=user_1_1";
ResponseEntity<PagedResources<WorkbasketAccessItemResource>> response = template.exchange(
url + port + parameters, HttpMethod.GET, request,
new ParameterizedTypeReference<PagedResources<WorkbasketAccessItemResource>>() {
@ -134,7 +134,7 @@ public class WorkbasketAccessItemControllerIntTest {
@Test
public void testGetBadRequestIfTryingToDeleteAccessItemsForGroup() {
String parameters = "/v1/workbasket-access-items/?access-id=cn=DevelopersGroup,ou=groups,o=TaskanaTest";
String parameters = "/v1/workbasket-access-items?access-id=cn=DevelopersGroup,ou=groups,o=TaskanaTest";
try {
ResponseEntity<Void> response = template.exchange(
url + port + parameters, HttpMethod.DELETE, request,

View File

@ -117,17 +117,12 @@ public class WorkbasketControllerIntTest {
new ParameterizedTypeReference<PagedResources<WorkbasketSummaryResource>>() {
});
assertEquals(5, response.getBody().getContent().size());
assertEquals("USER_1_1", response.getBody().getContent().iterator().next().key);
assertEquals("USER_1_1", response.getBody().getContent().iterator().next().getKey());
assertNotNull(response.getBody().getLink(Link.REL_SELF));
assertTrue(response.getBody()
.getLink(Link.REL_SELF)
.getHref()
.endsWith(parameters));
assertNotNull(response.getBody().getLink("allWorkbaskets"));
assertTrue(response.getBody()
.getLink("allWorkbaskets")
.getHref()
.endsWith("/v1/workbaskets"));
assertNotNull(response.getBody().getLink(Link.REL_FIRST));
assertNotNull(response.getBody().getLink(Link.REL_LAST));
assertNotNull(response.getBody().getLink(Link.REL_NEXT));
@ -150,7 +145,7 @@ public class WorkbasketControllerIntTest {
assertEquals(HttpStatus.OK, response2.getStatusCode());
Iterator<DistributionTargetResource> iterator = response2.getBody().getContent().iterator();
while (iterator.hasNext()) {
assertNotEquals("WBI:100000000000000000000000000000000007", iterator.next().workbasketId);
assertNotEquals("WBI:100000000000000000000000000000000007", iterator.next().getWorkbasketId());
}
}

View File

@ -41,7 +41,9 @@ import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import pro.taskana.rest.resource.WorkbasketDefinitionResource;
/**
* Integration tests for WorkbasketDefinitionController.
*/
@RunWith(SpringRunner.class)
@SpringBootTest(classes = RestConfiguration.class, webEnvironment = WebEnvironment.RANDOM_PORT)
public class WorkbasketDefinitionControllerIntTest {

View File

@ -1,14 +1,5 @@
package pro.taskana;
import java.io.InputStream;
import java.sql.SQLException;
import java.util.Properties;
import javax.annotation.PostConstruct;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.sql.DataSource;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
@ -19,14 +10,12 @@ import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
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.scheduling.annotation.EnableScheduling;
import org.springframework.transaction.PlatformTransactionManager;
import pro.taskana.jobs.TransactionalJobsConfiguration;
import pro.taskana.ldap.LdapCacheTestImpl;
import pro.taskana.ldap.LdapClient;
@ -36,6 +25,14 @@ import pro.taskana.rest.RestConfiguration;
import pro.taskana.rest.WebMvcConfig;
import pro.taskana.sampledata.SampleDataGenerator;
import javax.annotation.PostConstruct;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.sql.DataSource;
import java.io.InputStream;
import java.sql.SQLException;
import java.util.Properties;
/**
* Example Application showing the implementation of taskana-rest-spring for jboss application server.
*/

View File

@ -30,8 +30,10 @@ import com.fasterxml.jackson.databind.ObjectMapper;
import pro.taskana.rest.resource.TaskanaUserInfoResource;
// This test class is configured to run with postgres DB if you want to run it with h2 it is needed
// to change data source configuration at project-defaults.yml
/**
* This test class is configured to run with postgres DB if you want to run it with h2 it is needed.
* to change data source configuration at project-defaults.yml.
*/
@RunWith(Arquillian.class)
public class TaskanaWildflyTest {
@ -61,6 +63,7 @@ public class TaskanaWildflyTest {
ResponseEntity<TaskanaUserInfoResource> response = getRestTemplate().exchange(
"http://127.0.0.1:" + "8090" + "/v1/current-user-info", HttpMethod.GET, request,
new ParameterizedTypeReference<TaskanaUserInfoResource>() {
});
assertEquals(HttpStatus.OK, response.getStatusCode());

View File

@ -215,6 +215,19 @@
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>${spring.version}</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.9.2</version>
<scope>compile</scope>
</dependency>
<!---->
</dependencies>
<build>

View File

@ -26,7 +26,7 @@ public interface LdapCache {
* Find the groups belong to a user.
* @param searchFor the search string. The search is performed over names and ids of group .
* @param maxNumberOfReturnedAccessIds the maximum number of results to return.
* @return
* @return a List of access ids for groups of users.
*/
List<AccessIdResource> findGroupsOfUser(String searchFor, int maxNumberOfReturnedAccessIds);

View File

@ -7,30 +7,16 @@ import java.util.List;
import org.springframework.hateoas.PagedResources.PageMetadata;
import org.springframework.util.MultiValueMap;
import pro.taskana.BaseQuery;
import pro.taskana.exceptions.InvalidArgumentException;
/**
* Abstract superclass for taskana REST controller with pagable resources.
* Abstract superclass for taskana REST controller with pageable resources.
*/
public abstract class AbstractPagingController {
protected PageMetadata initPageMetadata(String pagesizeParam, String pageParam, long totalElements)
throws InvalidArgumentException {
long pagesize;
long page;
try {
pagesize = Long.valueOf(pagesizeParam);
page = Long.valueOf(pageParam);
} catch (NumberFormatException e) {
throw new InvalidArgumentException("page and pagesize must be a integer value.", e.getCause());
}
PageMetadata pageMetadata = new PageMetadata(pagesize, page, totalElements);
if (pageMetadata.getNumber() > pageMetadata.getTotalPages()) {
// unfortunately no setter for number
pageMetadata = new PageMetadata(pagesize, pageMetadata.getTotalPages(), totalElements);
}
return pageMetadata;
}
private static final String PAGING_PAGE = "page";
private static final String PAGING_PAGE_SIZE = "page-size";
protected String[] extractCommaSeparatedFields(List<String> list) {
List<String> values = new ArrayList<>();
@ -47,4 +33,89 @@ public abstract class AbstractPagingController {
}
}
protected PageMetadata getPageMetadata(MultiValueMap<String, String> params, BaseQuery<?, ?> query)
throws InvalidArgumentException {
PageMetadata pageMetadata = null;
if (hasPagingInformationInParams(params)) {
// paging
long totalElements = query.count();
pageMetadata = initPageMetadata(params, totalElements);
validateNoInvalidParameterIsLeft(params);
} else {
// not paging
validateNoInvalidParameterIsLeft(params);
}
return pageMetadata;
}
protected List<?> getQueryList(BaseQuery<?, ?> query, PageMetadata pageMetadata) {
List<?> resultList;
if (pageMetadata != null) {
resultList = query.listPage((int) pageMetadata.getNumber(), (int) pageMetadata.getSize());
} else {
resultList = query.list();
}
return resultList;
}
private boolean hasPagingInformationInParams(MultiValueMap<String, String> params) {
return params.getFirst(PAGING_PAGE) != null;
}
protected PageMetadata initPageMetadata(MultiValueMap<String, String> param, long totalElements)
throws InvalidArgumentException {
long pageSize = getPageSize(param);
long page = getPage(param);
PageMetadata pageMetadata = new PageMetadata(pageSize, page,
totalElements != 0 ? totalElements : Integer.MAX_VALUE);
if (pageMetadata.getNumber() > pageMetadata.getTotalPages()) {
// unfortunately no setter for number
pageMetadata = new PageMetadata(pageSize, pageMetadata.getTotalPages(), totalElements);
}
return pageMetadata;
}
/**
* This method is deprecated please remove it after updating taskana-simple-history reference to it.
*/
@Deprecated
protected PageMetadata initPageMetadata(String pagesizeParam, String pageParam, long totalElements)
throws InvalidArgumentException {
long pageSize;
long page;
try {
pageSize = Long.valueOf(pagesizeParam);
page = Long.valueOf(pageParam);
} catch (NumberFormatException e) {
throw new InvalidArgumentException("page and pageSize must be a integer value.", e.getCause());
}
PageMetadata pageMetadata = new PageMetadata(pageSize, page, totalElements);
if (pageMetadata.getNumber() > pageMetadata.getTotalPages()) {
// unfortunately no setter for number
pageMetadata = new PageMetadata(pageSize, pageMetadata.getTotalPages(), totalElements);
}
return pageMetadata;
}
private long getPage(MultiValueMap<String, String> params) throws InvalidArgumentException {
String param = params.getFirst(PAGING_PAGE);
params.remove(PAGING_PAGE);
try {
return Long.valueOf(param != null ? param : "1");
} catch (NumberFormatException e) {
throw new InvalidArgumentException("page must be a integer value.", e.getCause());
}
}
private long getPageSize(MultiValueMap<String, String> params) throws InvalidArgumentException {
String param = params.getFirst(PAGING_PAGE_SIZE);
params.remove(PAGING_PAGE_SIZE);
try {
return param != null ? Long.valueOf(param) : Integer.MAX_VALUE;
} catch (NumberFormatException e) {
throw new InvalidArgumentException("page-size must be a integer value.", e.getCause());
}
}
}

View File

@ -4,7 +4,6 @@ import java.util.List;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.hateoas.PagedResources;
import org.springframework.hateoas.PagedResources.PageMetadata;
import org.springframework.hateoas.config.EnableHypermediaSupport;
@ -38,7 +37,7 @@ import pro.taskana.exceptions.NotAuthorizedException;
import pro.taskana.rest.resource.ClassificationResource;
import pro.taskana.rest.resource.ClassificationResourceAssembler;
import pro.taskana.rest.resource.ClassificationSummaryResource;
import pro.taskana.rest.resource.ClassificationSummaryResourcesAssembler;
import pro.taskana.rest.resource.ClassificationSummaryResourceAssembler;
/**
* Controller for all {@link Classification} related endpoints.
@ -65,19 +64,25 @@ public class ClassificationController extends AbstractPagingController {
private static final String CUSTOM_6_LIKE = "custom-6-like";
private static final String CUSTOM_7_LIKE = "custom-7-like";
private static final String CUSTOM_8_LIKE = "custom-8-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";
@Autowired
private ClassificationService classificationService;
@Autowired
private ClassificationResourceAssembler classificationResourceAssembler;
private ClassificationSummaryResourceAssembler classificationSummaryResourceAssembler;
ClassificationController(
ClassificationService classificationService,
ClassificationResourceAssembler classificationResourceAssembler,
ClassificationSummaryResourceAssembler classificationSummaryResourceAssembler
) {
this.classificationService = classificationService;
this.classificationResourceAssembler = classificationResourceAssembler;
this.classificationSummaryResourceAssembler = classificationSummaryResourceAssembler;
}
@GetMapping
@Transactional(readOnly = true, rollbackFor = Exception.class)
public ResponseEntity<PagedResources<ClassificationSummaryResource>> getClassifications(
@ -90,34 +95,17 @@ public class ClassificationController extends AbstractPagingController {
query = applySortingParams(query, params);
query = applyFilterParams(query, params);
PageMetadata pageMetadata = null;
List<ClassificationSummary> classificationSummaries = 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) {
// paging
long totalElements = query.count();
pageMetadata = initPageMetadata(pageSize, page, totalElements);
classificationSummaries = query.listPage((int) pageMetadata.getNumber(),
(int) pageMetadata.getSize());
} else if (page == null && pageSize == null) {
// not paging
classificationSummaries = query.list();
} else {
throw new InvalidArgumentException("Paging information is incomplete.");
}
ClassificationSummaryResourcesAssembler assembler = new ClassificationSummaryResourcesAssembler();
PagedResources<ClassificationSummaryResource> pagedResources = assembler.toResources(classificationSummaries,
PageMetadata pageMetadata = getPageMetadata(params, query);
List<ClassificationSummary> classificationSummaries = (List<ClassificationSummary>) getQueryList(query,
pageMetadata);
ResponseEntity<PagedResources<ClassificationSummaryResource>> response = new ResponseEntity<>(pagedResources,
HttpStatus.OK);
ResponseEntity<PagedResources<ClassificationSummaryResource>> response = new ResponseEntity<>(
classificationSummaryResourceAssembler.toResources(
classificationSummaries,
pageMetadata), HttpStatus.OK);
if (LOGGER.isDebugEnabled()) {
LOGGER.debug("Exit from getClassifications(), returning {}", response);
LOGGER.debug("Exit from getClassifications(), returning {}",
new ResponseEntity<>(response, HttpStatus.OK));
}
return response;
@ -126,14 +114,17 @@ public class ClassificationController extends AbstractPagingController {
@GetMapping(path = "/{classificationId}")
@Transactional(readOnly = true, rollbackFor = Exception.class)
public ResponseEntity<ClassificationResource> getClassification(@PathVariable String classificationId)
throws ClassificationNotFoundException, NotAuthorizedException, ClassificationAlreadyExistException,
ConcurrencyException, DomainNotFoundException, InvalidArgumentException {
LOGGER.debug("Entry to getClassification(classificationId= {})", classificationId);
throws ClassificationNotFoundException {
if (LOGGER.isDebugEnabled()) {
LOGGER.debug("Entry to getClassification(classificationId= {})", classificationId);
}
Classification classification = classificationService.getClassification(classificationId);
ResponseEntity<ClassificationResource> response = new ResponseEntity<>(
classificationResourceAssembler.toResource(classification), HttpStatus.OK);
if (LOGGER.isDebugEnabled()) {
LOGGER.debug("Exit from getClassification(), returning {}", response);
LOGGER.debug("Exit from getClassification(), returning {}",
ResponseEntity.status(HttpStatus.OK).body(classificationResourceAssembler.toResource(classification)));
}
return response;
@ -148,7 +139,6 @@ public class ClassificationController extends AbstractPagingController {
if (LOGGER.isDebugEnabled()) {
LOGGER.debug("Entry to createClassification(resource= {})", resource);
}
Classification classification = classificationResourceAssembler.toModel(resource);
classification = classificationService.createClassification(classification);

View File

@ -1,13 +1,16 @@
package pro.taskana.rest;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
@ -19,6 +22,10 @@ import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import pro.taskana.Classification;
import pro.taskana.ClassificationQuery;
import pro.taskana.ClassificationService;
@ -33,15 +40,6 @@ import pro.taskana.impl.util.LoggerUtils;
import pro.taskana.rest.resource.ClassificationResource;
import pro.taskana.rest.resource.ClassificationResourceAssembler;
import java.io.IOException;
import java.util.HashMap;
import java.util.HashSet;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.util.Set;
/**
* Controller for Importing / Exporting classifications.
*/
@ -51,12 +49,18 @@ public class ClassificationDefinitionController {
private static final Logger LOGGER = LoggerFactory.getLogger(ClassificationDefinitionController.class);
@Autowired
private ClassificationService classificationService;
@Autowired
private ClassificationResourceAssembler classificationResourceAssembler;
ClassificationDefinitionController(
ClassificationService classificationService,
ClassificationResourceAssembler classificationResourceAssembler
) {
this.classificationService = classificationService;
this.classificationResourceAssembler = classificationResourceAssembler;
}
@GetMapping
@Transactional(readOnly = true, rollbackFor = Exception.class)
public ResponseEntity<List<ClassificationResource>> exportClassifications(
@ -169,7 +173,7 @@ public class ClassificationDefinitionController {
updateExistingClassification(classificationResource, systemId);
} else {
classificationService.createClassification(
classificationResourceAssembler.toModel(classificationResource));
classificationResourceAssembler.toModel(classificationResource));
}
}
LOGGER.debug("Exit from insertOrUpdateClassificationsWithoutParent()");
@ -192,8 +196,8 @@ public class ClassificationDefinitionController {
}
private void updateExistingClassification(ClassificationResource cl,
String systemId) throws ClassificationNotFoundException, NotAuthorizedException,
ConcurrencyException, InvalidArgumentException {
String systemId) throws ClassificationNotFoundException, NotAuthorizedException,
ConcurrencyException, InvalidArgumentException {
LOGGER.debug("Entry to updateExistingClassification()");
Classification currentClassification = classificationService.getClassification(systemId);
if (cl.getType() != null && !cl.getType().equals(currentClassification.getType())) {

View File

@ -8,7 +8,6 @@ import java.util.stream.Stream;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.transaction.annotation.Transactional;
@ -22,8 +21,8 @@ import pro.taskana.TaskState;
import pro.taskana.exceptions.InvalidArgumentException;
import pro.taskana.exceptions.NotAuthorizedException;
import pro.taskana.impl.report.header.TimeIntervalColumnHeader;
import pro.taskana.rest.resource.ReportAssembler;
import pro.taskana.rest.resource.ReportResource;
import pro.taskana.rest.resource.ReportResourceAssembler;
/**
* Controller for all monitoring endpoints.
@ -34,11 +33,14 @@ public class MonitorController {
private static final Logger LOGGER = LoggerFactory.getLogger(MonitorController.class);
@Autowired
private TaskMonitorService taskMonitorService;
@Autowired
private ReportAssembler reportAssembler;
private ReportResourceAssembler reportResourceAssembler;
MonitorController(TaskMonitorService taskMonitorService, ReportResourceAssembler reportResourceAssembler) {
this.taskMonitorService = taskMonitorService;
this.reportResourceAssembler = reportResourceAssembler;
}
@GetMapping(path = "/tasks-status-report")
@Transactional(readOnly = true, rollbackFor = Exception.class)
@ -46,18 +48,14 @@ public class MonitorController {
@RequestParam(required = false) List<TaskState> states) throws NotAuthorizedException,
InvalidArgumentException {
LOGGER.debug("Entry to getTasksStatusReport()");
ReportResource report = reportAssembler.toResource(
taskMonitorService.createTaskStatusReportBuilder()
.stateIn(states)
.domainIn(domains)
.buildReport(),
domains, states);
ResponseEntity<ReportResource> response = new ResponseEntity<>(reportResourceAssembler.toResource(
taskMonitorService.createTaskStatusReportBuilder().stateIn(states).domainIn(domains).buildReport(),
domains, states), HttpStatus.OK);
if (LOGGER.isDebugEnabled()) {
LOGGER.debug("Exit from getTasksStatusReport(), returning {}", report);
LOGGER.debug("Exit from getTasksStatusReport(), returning {}", response);
}
return ResponseEntity.status(HttpStatus.OK)
.body(report);
return response;
}
@GetMapping(path = "/tasks-workbasket-report")
@ -67,7 +65,7 @@ public class MonitorController {
throws NotAuthorizedException, InvalidArgumentException {
LOGGER.debug("Entry to getTasksWorkbasketReport()");
ReportResource report = reportAssembler.toResource(
ReportResource report = reportResourceAssembler.toResource(
taskMonitorService.createWorkbasketReportBuilder()
.withColumnHeaders(getRangeTimeInterval())
.buildReport(), states);
@ -89,7 +87,7 @@ public class MonitorController {
throws NotAuthorizedException, InvalidArgumentException {
LOGGER.debug("Entry to getTasksWorkbasketPlannedDateReport()");
ReportResource report = reportAssembler.toResource(
ReportResource report = reportResourceAssembler.toResource(
taskMonitorService.createWorkbasketReportBuilder()
.stateIn(states)
.withColumnHeaders(getDateTimeInterval(daysInPast)).buildPlannedDateBasedReport(),
@ -103,13 +101,14 @@ public class MonitorController {
}
@GetMapping(path = "/tasks-classification-report")
@Transactional(readOnly = true, rollbackFor = Exception.class)
public ResponseEntity<ReportResource> getTasksClassificationReport()
throws NotAuthorizedException, InvalidArgumentException {
LOGGER.debug("Entry to getTasksClassificationReport()");
ReportResource report = reportAssembler.toResource(
ReportResource report = reportResourceAssembler.toResource(
taskMonitorService.createClassificationReportBuilder()
.withColumnHeaders(getRangeTimeInterval())
.buildReport());
@ -130,7 +129,7 @@ public class MonitorController {
.mapToObj(TimeIntervalColumnHeader.Date::new)
.collect(Collectors.toList());
return ResponseEntity.status(HttpStatus.OK)
.body(reportAssembler.toResource(
.body(reportResourceAssembler.toResource(
taskMonitorService.createTimestampReportBuilder()
.withColumnHeaders(columnHeaders)
.buildReport()));

View File

@ -7,10 +7,7 @@ import javax.sql.DataSource;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.beans.factory.config.ConfigurableBeanFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Scope;
import org.springframework.context.annotation.*;
import org.springframework.http.converter.json.SpringHandlerInstantiator;
import org.springframework.transaction.annotation.EnableTransactionManagement;

View File

@ -5,7 +5,6 @@ import java.util.List;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.hateoas.PagedResources;
import org.springframework.hateoas.PagedResources.PageMetadata;
import org.springframework.hateoas.config.EnableHypermediaSupport;
@ -44,7 +43,7 @@ import pro.taskana.exceptions.WorkbasketNotFoundException;
import pro.taskana.rest.resource.TaskResource;
import pro.taskana.rest.resource.TaskResourceAssembler;
import pro.taskana.rest.resource.TaskSummaryResource;
import pro.taskana.rest.resource.TaskSummaryResourcesAssembler;
import pro.taskana.rest.resource.TaskSummaryResourceAssembler;
/**
* Controller for all {@link Task} related endpoints.
@ -81,15 +80,22 @@ public class TaskController extends AbstractPagingController {
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";
@Autowired
private TaskService taskService;
@Autowired
private TaskResourceAssembler taskResourceAssembler;
private TaskSummaryResourceAssembler taskSummaryResourceAssembler;
TaskController(
TaskService taskService,
TaskResourceAssembler taskResourceAssembler,
TaskSummaryResourceAssembler taskSummaryResourceAssembler
) {
this.taskService = taskService;
this.taskResourceAssembler = taskResourceAssembler;
this.taskSummaryResourceAssembler = taskSummaryResourceAssembler;
}
@GetMapping
@Transactional(readOnly = true, rollbackFor = Exception.class)
public ResponseEntity<PagedResources<TaskSummaryResource>> getTasks(
@ -102,29 +108,10 @@ public class TaskController extends AbstractPagingController {
query = applyFilterParams(query, params);
query = applySortingParams(query, params);
PageMetadata pageMetadata = null;
List<TaskSummary> taskSummaries = 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) {
// paging
long totalElements = query.count();
pageMetadata = initPageMetadata(pageSize, page,
totalElements);
taskSummaries = query.listPage((int) pageMetadata.getNumber(),
(int) pageMetadata.getSize());
} else if (page == null && pageSize == null) {
// not paging
taskSummaries = query.list();
} else {
throw new InvalidArgumentException("Paging information is incomplete.");
}
PageMetadata pageMetadata = getPageMetadata(params, query);
List<TaskSummary> taskSummaries = (List<TaskSummary>) getQueryList(query, pageMetadata);
TaskSummaryResourcesAssembler taskSummaryResourcesAssembler = new TaskSummaryResourcesAssembler();
PagedResources<TaskSummaryResource> pagedResources = taskSummaryResourcesAssembler.toResources(taskSummaries,
PagedResources<TaskSummaryResource> pagedResources = taskSummaryResourceAssembler.toResources(taskSummaries,
pageMetadata);
ResponseEntity<PagedResources<TaskSummaryResource>> response = new ResponseEntity<>(pagedResources, HttpStatus.OK);
if (LOGGER.isDebugEnabled()) {

View File

@ -2,6 +2,7 @@ package pro.taskana.rest;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
@ -29,11 +30,16 @@ public class TaskanaEngineController {
TaskanaEngine taskanaEngine;
TaskanaEngineController(TaskanaEngineConfiguration taskanaEngineConfiguration, TaskanaEngine taskanaEngine) {
TaskanaEngineController(
TaskanaEngineConfiguration taskanaEngineConfiguration, TaskanaEngine taskanaEngine) {
this.taskanaEngineConfiguration = taskanaEngineConfiguration;
this.taskanaEngine = taskanaEngine;
}
@Value("${version:Local build}")
private String version;
@GetMapping(path = "/v1/domains", produces = {MediaType.APPLICATION_JSON_VALUE})
public ResponseEntity<List<String>> getDomains() {
ResponseEntity<List<String>> response = new ResponseEntity<>(taskanaEngineConfiguration.getDomains(),

View File

@ -25,8 +25,8 @@ import pro.taskana.WorkbasketService;
import pro.taskana.exceptions.InvalidArgumentException;
import pro.taskana.exceptions.NotAuthorizedException;
import pro.taskana.ldap.LdapClient;
import pro.taskana.rest.resource.WorkbasketAccessItemResourceAssembler;
import pro.taskana.rest.resource.WorkbasketAccessItemResource;
import pro.taskana.rest.resource.WorkbasketAccessItemAssembler;
/**
* Controller for Workbasket access.
@ -48,15 +48,15 @@ public class WorkbasketAccessItemController extends AbstractPagingController {
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";
@Autowired
LdapClient ldapClient;
@Autowired
private WorkbasketService workbasketService;
@Autowired
private WorkbasketAccessItemResourceAssembler workbasketAccessItemResourceAssembler;
/**
* This GET method return all workbasketAccessItems that correspond the given data.
*
@ -78,31 +78,15 @@ public class WorkbasketAccessItemController extends AbstractPagingController {
query = applyFilterParams(query, params);
query = applySortingParams(query, params);
PagedResources.PageMetadata pageMetadata = null;
List<WorkbasketAccessItem> workbasketAccessItems;
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) {
// paging
long totalElements = query.count();
pageMetadata = initPageMetadata(pageSize, page, totalElements);
workbasketAccessItems = query.listPage((int) pageMetadata.getNumber(),
(int) pageMetadata.getSize());
} else if (page == null && pageSize == null) {
// not paging
workbasketAccessItems = query.list();
} else {
throw new InvalidArgumentException("Paging information is incomplete.");
}
WorkbasketAccessItemAssembler assembler = new WorkbasketAccessItemAssembler();
PagedResources<WorkbasketAccessItemResource> pagedResources = assembler.toResources(
workbasketAccessItems,
PagedResources.PageMetadata pageMetadata = getPageMetadata(params, query);
List<WorkbasketAccessItem> workbasketAccessItems = (List<WorkbasketAccessItem>) getQueryList(query,
pageMetadata);
PagedResources pagedResources = workbasketAccessItemResourceAssembler.toResources(
workbasketAccessItems,
pageMetadata
);
ResponseEntity<PagedResources<WorkbasketAccessItemResource>> response = new ResponseEntity<>(pagedResources, HttpStatus.OK);
if (LOGGER.isDebugEnabled()) {
LOGGER.debug("Exit from getWorkbasketAccessItems(), returning {}", response);

View File

@ -6,7 +6,6 @@ import java.util.List;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.hateoas.PagedResources;
import org.springframework.hateoas.PagedResources.PageMetadata;
import org.springframework.hateoas.Resources;
@ -27,7 +26,6 @@ import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import pro.taskana.BaseQuery.SortDirection;
import pro.taskana.TaskService;
import pro.taskana.Workbasket;
import pro.taskana.WorkbasketAccessItem;
import pro.taskana.WorkbasketPermission;
@ -43,15 +41,14 @@ import pro.taskana.exceptions.WorkbasketAlreadyExistException;
import pro.taskana.exceptions.WorkbasketInUseException;
import pro.taskana.exceptions.WorkbasketNotFoundException;
import pro.taskana.impl.util.LoggerUtils;
import pro.taskana.rest.resource.DistributionTargetListAssembler;
import pro.taskana.rest.resource.DistributionTargetResource;
import pro.taskana.rest.resource.WorkbasketAccessItemAssembler;
import pro.taskana.rest.resource.WorkbasketAccessItemListAssembler;
import pro.taskana.rest.resource.DistributionTargetResourceAssembler;
import pro.taskana.rest.resource.WorkbasketAccessItemResource;
import pro.taskana.rest.resource.WorkbasketAccessItemResourceAssembler;
import pro.taskana.rest.resource.WorkbasketResource;
import pro.taskana.rest.resource.WorkbasketResourceAssembler;
import pro.taskana.rest.resource.WorkbasketSummaryResource;
import pro.taskana.rest.resource.WorkbasketSummaryResourcesAssembler;
import pro.taskana.rest.resource.WorkbasketSummaryResourceAssembler;
/**
* Controller for all {@link Workbasket} related endpoints.
@ -79,26 +76,27 @@ public class WorkbasketController extends AbstractPagingController {
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";
@Autowired
private WorkbasketService workbasketService;
@Autowired
private TaskService taskService;
@Autowired
private WorkbasketResourceAssembler workbasketResourceAssembler;
@Autowired
private DistributionTargetListAssembler distributionTargetListAssembler;
private WorkbasketSummaryResourceAssembler workbasketSummaryResourceAssembler;
@Autowired
private WorkbasketAccessItemListAssembler accessItemListAssembler;
private DistributionTargetResourceAssembler distributionTargetResourceAssembler;
@Autowired
private WorkbasketAccessItemAssembler workbasketAccessItemAssembler;
private WorkbasketAccessItemResourceAssembler workbasketAccessItemResourceAssembler;
WorkbasketController(WorkbasketService workbasketService,
WorkbasketResourceAssembler workbasketResourceAssembler,
WorkbasketSummaryResourceAssembler workbasketSummaryResourceAssembler,
DistributionTargetResourceAssembler distributionTargetResourceAssembler,
WorkbasketAccessItemResourceAssembler workbasketAccessItemResourceAssembler) {
this.workbasketService = workbasketService;
this.workbasketResourceAssembler = workbasketResourceAssembler;
this.workbasketSummaryResourceAssembler = workbasketSummaryResourceAssembler;
this.distributionTargetResourceAssembler = distributionTargetResourceAssembler;
this.workbasketAccessItemResourceAssembler = workbasketAccessItemResourceAssembler;
}
@GetMapping
@Transactional(readOnly = true, rollbackFor = Exception.class)
@ -112,28 +110,9 @@ public class WorkbasketController extends AbstractPagingController {
query = applySortingParams(query, params);
query = applyFilterParams(query, params);
PageMetadata pageMetadata = null;
List<WorkbasketSummary> workbasketSummaries = 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) {
// paging
long totalElements = query.count();
pageMetadata = initPageMetadata(pageSize, page, totalElements);
workbasketSummaries = query.listPage((int) pageMetadata.getNumber(),
(int) pageMetadata.getSize());
} else if (page == null && pageSize == null) {
// not paging
workbasketSummaries = query.list();
} else {
throw new InvalidArgumentException("Paging information is incomplete.");
}
WorkbasketSummaryResourcesAssembler assembler = new WorkbasketSummaryResourcesAssembler();
PagedResources<WorkbasketSummaryResource> pagedResources = assembler.toResources(workbasketSummaries,
PageMetadata pageMetadata = getPageMetadata(params, query);
List<WorkbasketSummary> workbasketSummaries = (List<WorkbasketSummary>) getQueryList(query, pageMetadata);
PagedResources pagedResources = workbasketSummaryResourceAssembler.toResources(workbasketSummaries,
pageMetadata);
ResponseEntity<PagedResources<WorkbasketSummaryResource>> response = new ResponseEntity<>(pagedResources,
@ -166,7 +145,8 @@ public class WorkbasketController extends AbstractPagingController {
throws NotAuthorizedException, InvalidArgumentException,
WorkbasketNotFoundException, WorkbasketInUseException {
LOGGER.debug("Entry to markWorkbasketForDeletion(workbasketId= {})", workbasketId);
ResponseEntity<?> response = new ResponseEntity<>(workbasketService.deleteWorkbasket(workbasketId), HttpStatus.ACCEPTED);
ResponseEntity<?> response = new ResponseEntity<>(workbasketService.deleteWorkbasket(workbasketId),
HttpStatus.ACCEPTED);
LOGGER.debug("Exit from markWorkbasketForDeletion(), returning {}",
response);
return response;
@ -183,7 +163,8 @@ public class WorkbasketController extends AbstractPagingController {
Workbasket workbasket = workbasketResourceAssembler.toModel(workbasketResource);
workbasket = workbasketService.createWorkbasket(workbasket);
ResponseEntity<WorkbasketResource> response = new ResponseEntity<>(workbasketResourceAssembler.toResource(workbasket), HttpStatus.CREATED);
ResponseEntity<WorkbasketResource> response = new ResponseEntity<>(
workbasketResourceAssembler.toResource(workbasket), HttpStatus.CREATED);
if (LOGGER.isDebugEnabled()) {
LOGGER.debug("Exit from createWorkbasket(), returning {}", response);
}
@ -226,9 +207,8 @@ public class WorkbasketController extends AbstractPagingController {
ResponseEntity<Resources<WorkbasketAccessItemResource>> result;
List<WorkbasketAccessItem> accessItems = workbasketService.getWorkbasketAccessItems(workbasketId);
Resources<WorkbasketAccessItemResource> accessItemListResource = accessItemListAssembler
.toResource(workbasketId, accessItems);
result = new ResponseEntity<>(accessItemListResource, HttpStatus.OK);
result = new ResponseEntity<>(workbasketAccessItemResourceAssembler
.toResources(workbasketId, accessItems), HttpStatus.OK);
if (LOGGER.isDebugEnabled()) {
LOGGER.debug("Exit from getWorkbasketAccessItems(), returning {}", result);
}
@ -248,14 +228,14 @@ public class WorkbasketController extends AbstractPagingController {
}
List<WorkbasketAccessItem> wbAccessItems = new ArrayList<>();
workbasketAccessResourceItems.forEach(item -> wbAccessItems.add(workbasketAccessItemAssembler.toModel(item)));
workbasketAccessResourceItems.forEach(
item -> wbAccessItems.add(workbasketAccessItemResourceAssembler.toModel(item)));
workbasketService.setWorkbasketAccessItems(workbasketId, wbAccessItems);
List<WorkbasketAccessItem> updatedWbAccessItems = workbasketService.getWorkbasketAccessItems(workbasketId);
Resources<WorkbasketAccessItemResource> accessItemListResource = accessItemListAssembler
.toResource(workbasketId, updatedWbAccessItems);
ResponseEntity<Resources<WorkbasketAccessItemResource>> response = new ResponseEntity<>(accessItemListResource, HttpStatus.OK);
ResponseEntity<Resources<WorkbasketAccessItemResource>> response = new ResponseEntity<>(
workbasketAccessItemResourceAssembler
.toResources(workbasketId, updatedWbAccessItems), HttpStatus.OK);
if (LOGGER.isDebugEnabled()) {
LOGGER.debug("Exit from setWorkbasketAccessItems(), returning {}", response);
}
@ -268,11 +248,12 @@ public class WorkbasketController extends AbstractPagingController {
public ResponseEntity<Resources<DistributionTargetResource>> getDistributionTargets(
@PathVariable(value = "workbasketId") String workbasketId)
throws WorkbasketNotFoundException, NotAuthorizedException {
LOGGER.debug("Entry to getDistributionTargets(workbasketId= {})", workbasketId);
ResponseEntity<Resources<DistributionTargetResource>> result;
List<WorkbasketSummary> distributionTargets = workbasketService.getDistributionTargets(workbasketId);
Resources<DistributionTargetResource> distributionTargetListResource = distributionTargetListAssembler
.toResource(workbasketId, distributionTargets);
Resources<DistributionTargetResource> distributionTargetListResource = distributionTargetResourceAssembler
.toResources(workbasketId, distributionTargets);
result = new ResponseEntity<>(distributionTargetListResource, HttpStatus.OK);
if (LOGGER.isDebugEnabled()) {
LOGGER.debug("Exit from getDistributionTargets(), returning {}", result);
@ -295,10 +276,9 @@ public class WorkbasketController extends AbstractPagingController {
workbasketService.setDistributionTargets(sourceWorkbasketId, targetWorkbasketIds);
List<WorkbasketSummary> distributionTargets = workbasketService.getDistributionTargets(sourceWorkbasketId);
Resources<DistributionTargetResource> distributionTargetListResource = distributionTargetListAssembler
.toResource(sourceWorkbasketId, distributionTargets);
ResponseEntity<Resources<DistributionTargetResource>> response = new ResponseEntity<>(distributionTargetListResource, HttpStatus.OK);
ResponseEntity<Resources<DistributionTargetResource>> response = new ResponseEntity<>(
distributionTargetResourceAssembler
.toResources(sourceWorkbasketId, distributionTargets), HttpStatus.OK);
if (LOGGER.isDebugEnabled()) {
LOGGER.debug("Exit from getTasksStatusReport(), returning {}", response);
}

View File

@ -9,7 +9,6 @@ import java.util.stream.Collectors;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
@ -49,12 +48,18 @@ public class WorkbasketDefinitionController {
private static final Logger LOGGER = LoggerFactory.getLogger(WorkbasketDefinitionController.class);
@Autowired
private WorkbasketService workbasketService;
@Autowired
private WorkbasketDefinitionResourceAssembler workbasketDefinitionAssembler;
WorkbasketDefinitionController(
WorkbasketService workbasketService,
WorkbasketDefinitionResourceAssembler workbasketDefinitionAssembler
) {
this.workbasketService = workbasketService;
this.workbasketDefinitionAssembler = workbasketDefinitionAssembler;
}
@GetMapping
@Transactional(readOnly = true, rollbackFor = Exception.class)
public ResponseEntity<List<WorkbasketDefinitionResource>> exportWorkbaskets(@RequestParam(required = false) String domain)
@ -86,6 +91,13 @@ public class WorkbasketDefinitionController {
* @param file the list of workbasket definitions which will be imported to the current system.
* @return Return answer is determined by the status code: 200 - all good 400 - list state error (referring to non
* existing id's) 401 - not authorized
* @throws IOException if multipart file cannot be parsed.
* @throws NotAuthorizedException if the user is not authorized.
* @throws DomainNotFoundException if domain information is incorrect.
* @throws InvalidWorkbasketException if workbasket has invalid information.
* @throws WorkbasketAlreadyExistException if workbasket already exists when trying to create a new one.
* @throws WorkbasketNotFoundException if do not exists a workbasket in the system with the used id.
* @throws InvalidArgumentException if authorization information in workbaskets definitions is incorrect.
*/
@PostMapping
@Transactional(rollbackFor = Exception.class)

View File

@ -1,175 +0,0 @@
package pro.taskana.rest.query;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.util.MultiValueMap;
import pro.taskana.TaskQuery;
import pro.taskana.TaskService;
import pro.taskana.TaskState;
import pro.taskana.TaskSummary;
import pro.taskana.exceptions.InvalidArgumentException;
import pro.taskana.impl.util.LoggerUtils;
/**
* TODO.
*/
@Component
public class TaskFilter {
private static final Logger LOGGER = LoggerFactory.getLogger(TaskFilter.class);
private static final String CLASSIFICATION = "classification";
private static final String POR = "por";
private static final String DOT = ".";
private static final String STATE = "state";
private static final String PRIORITY = "priority";
private static final String DESCRIPTION = "description";
private static final String NAME = "name";
private static final String OWNER = "owner";
private static final String WORKBASKET_ID = "workbasketId";
private static final String CUSTOM = "custom";
private static final String IS_TRANSFERRED = "isTransferred";
private static final String IS_READ = "isRead";
private static final String CLASSIFICATION_KEY = CLASSIFICATION + DOT + "key";
private static final String POR_VALUE = POR + DOT + "value";
private static final String POR_TYPE = POR + DOT + "type";
private static final String POR_SYSTEM_INSTANCE = POR + DOT + "systemInstance";
private static final String POR_SYSTEM = POR + DOT + "system";
private static final String POR_COMPANY = POR + DOT + "company";
private static final String CLAIMED = "CLAIMED";
private static final String COMPLETED = "COMPLETED";
private static final String READY = "READY";
private static final String COMMA = ",";
@Autowired
private TaskService taskService;
public List<TaskSummary> getAll() {
return taskService.createTaskQuery().list();
}
public List<TaskSummary> inspectParams(MultiValueMap<String, String> params)
throws InvalidArgumentException {
if (LOGGER.isDebugEnabled()) {
LOGGER.debug("Entry to inspectParams(params= {})", params);
}
TaskQuery taskQuery = taskService.createTaskQuery();
// apply filters
if (params.containsKey(NAME)) {
String[] names = extractCommaSeperatedFields(params.get(NAME));
taskQuery.nameIn(names);
}
if (params.containsKey(DESCRIPTION)) {
taskQuery.descriptionLike(params.get(DESCRIPTION).get(0));
}
if (params.containsKey(PRIORITY)) {
String[] prioritesInString = extractCommaSeperatedFields(params.get(PRIORITY));
int[] priorites = extractPriorities(prioritesInString);
taskQuery.priorityIn(priorites);
}
if (params.containsKey(STATE)) {
TaskState[] states = extractStates(params);
taskQuery.stateIn(states);
}
if (params.containsKey(CLASSIFICATION_KEY)) {
String[] classificationKeys = extractCommaSeperatedFields(params.get(CLASSIFICATION_KEY));
taskQuery.classificationKeyIn(classificationKeys);
}
if (params.containsKey(WORKBASKET_ID)) {
String[] workbaskets = extractCommaSeperatedFields(params.get(WORKBASKET_ID));
taskQuery.workbasketIdIn(workbaskets);
}
if (params.containsKey(OWNER)) {
String[] owners = extractCommaSeperatedFields(params.get(OWNER));
taskQuery.ownerIn(owners);
}
// objectReference
if (params.keySet().stream().filter(s -> s.startsWith(POR)).toArray().length > 0) {
if (params.containsKey(POR_COMPANY)) {
String[] companies = extractCommaSeperatedFields(params.get(POR_COMPANY));
taskQuery.primaryObjectReferenceCompanyIn(companies);
}
if (params.containsKey(POR_SYSTEM)) {
String[] systems = extractCommaSeperatedFields(params.get(POR_SYSTEM));
taskQuery.primaryObjectReferenceSystemIn(systems);
}
if (params.containsKey(POR_SYSTEM_INSTANCE)) {
String[] systemInstances = extractCommaSeperatedFields(params.get(POR_SYSTEM_INSTANCE));
taskQuery.primaryObjectReferenceSystemInstanceIn(systemInstances);
}
if (params.containsKey(POR_TYPE)) {
String[] types = extractCommaSeperatedFields(params.get(POR_TYPE));
taskQuery.primaryObjectReferenceTypeIn(types);
}
if (params.containsKey(POR_VALUE)) {
String[] values = extractCommaSeperatedFields(params.get(POR_VALUE));
taskQuery.primaryObjectReferenceValueIn(values);
}
}
if (params.containsKey(IS_READ)) {
taskQuery.readEquals(Boolean.getBoolean(params.get(IS_READ).get(0)));
}
if (params.containsKey(IS_TRANSFERRED)) {
taskQuery.transferredEquals(Boolean.getBoolean(params.get(IS_TRANSFERRED).get(0)));
}
if (LOGGER.isDebugEnabled()) {
LOGGER.debug("Exit from inspectParams(), returning {}", LoggerUtils.listToString(taskQuery.list()));
}
return taskQuery.list();
}
private int[] extractPriorities(String[] prioritesInString) {
int[] priorites = new int[prioritesInString.length];
for (int i = 0; i < prioritesInString.length; i++) {
priorites[i] = Integer.getInteger(prioritesInString[i]);
}
return priorites;
}
private String[] extractCommaSeperatedFields(List<String> list) {
List<String> values = new ArrayList<>();
list.forEach(item -> values.addAll(Arrays.asList(item.split(COMMA))));
return values.toArray(new String[0]);
}
private TaskState[] extractStates(MultiValueMap<String, String> params) throws InvalidArgumentException {
if (LOGGER.isDebugEnabled()) {
LOGGER.debug("Entry to extractStates(params= {})", params);
}
List<TaskState> states = new ArrayList<>();
for (String item : params.get(STATE)) {
for (String state : item.split(COMMA)) {
switch (state) {
case READY:
states.add(TaskState.READY);
break;
case COMPLETED:
states.add(TaskState.COMPLETED);
break;
case CLAIMED:
states.add(TaskState.CLAIMED);
break;
default:
throw new InvalidArgumentException("Unknown status '" + state + "'");
}
}
}
LOGGER.debug("Exit from extractStates()");
return states.toArray(new TaskState[0]);
}
}

View File

@ -1,59 +1,69 @@
package pro.taskana.rest.resource;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import org.springframework.hateoas.Link;
import org.springframework.hateoas.PagedResources;
import org.springframework.hateoas.PagedResources.PageMetadata;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import org.springframework.web.servlet.support.ServletUriComponentsBuilder;
import org.springframework.web.util.UriComponentsBuilder;
import javax.servlet.http.HttpServletRequest;
import java.util.Iterator;
import java.util.Map;
/**
* Base assembler for paged list resources.
* Abstract resources assembler for taskana REST controller with pageable resources.
* This method is deprecated, it can be removed after fixing taskana-simple-history references
*/
@Deprecated
public abstract class AbstractRessourcesAssembler {
UriComponentsBuilder original;
UriComponentsBuilder original = getBuilderForOriginalUri();
public AbstractRessourcesAssembler() {
original = getBuilderForOriginalUri();
}
protected static UriComponentsBuilder getBuilderForOriginalUri() {
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes())
.getRequest();
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
UriComponentsBuilder baseUri = ServletUriComponentsBuilder.fromServletMapping(request)
.path(request.getRequestURI());
for (Map.Entry<String, String[]> entry : request.getParameterMap().entrySet()) {
for (String value : entry.getValue()) {
baseUri.queryParam(entry.getKey(), value);
Iterator var2 = request.getParameterMap().entrySet().iterator();
while (var2.hasNext()) {
Map.Entry<String, String[]> entry = (Map.Entry) var2.next();
String[] var4 = (String[]) entry.getValue();
int var5 = var4.length;
for (int var6 = 0; var6 < var5; ++var6) {
String value = var4[var6];
baseUri.queryParam((String) entry.getKey(), new Object[] {value});
}
}
UriComponentsBuilder original = baseUri;
return original;
return baseUri;
}
protected PagedResources<?> addPageLinks(PagedResources<?> pagedResources, PageMetadata pageMetadata) {
protected PagedResources<?> addPageLinks(PagedResources<?> pagedResources,
PagedResources.PageMetadata pageMetadata) {
UriComponentsBuilder original = getBuilderForOriginalUri();
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));
pagedResources.add(
(new Link(original.replaceQueryParam("page", new Object[] {1}).toUriString())).withRel("first"));
pagedResources.add((new Link(
original.replaceQueryParam("page", new Object[] {pageMetadata.getTotalPages()}).toUriString())).withRel(
"last"));
if (pageMetadata.getNumber() > 1L) {
pagedResources.add((new Link(
original.replaceQueryParam("page", new Object[] {pageMetadata.getNumber() - 1L})
.toUriString())).withRel("prev"));
}
if (pageMetadata.getNumber() < pageMetadata.getTotalPages()) {
pagedResources
.add(new Link(original.replaceQueryParam("page", pageMetadata.getNumber() + 1).toUriString())
.withRel(Link.REL_NEXT));
pagedResources.add((new Link(
original.replaceQueryParam("page", new Object[] {pageMetadata.getNumber() + 1L})
.toUriString())).withRel("next"));
}
return pagedResources;
}
}

View File

@ -5,12 +5,14 @@ import java.util.Map;
import org.springframework.hateoas.ResourceSupport;
import pro.taskana.Attachment;
import pro.taskana.ObjectReference;
/**
* Resource class for {@link pro.taskana.Attachment}.
*/
public class AttachmentResource extends ResourceSupport {
private String attachmentId;
private String taskId;
private String created;
@ -20,6 +22,21 @@ public class AttachmentResource extends ResourceSupport {
private String channel;
private String received;
public AttachmentResource() {
}
public AttachmentResource(Attachment attachment) {
this.attachmentId = attachment.getId();
this.taskId = attachment.getTaskId();
this.created = attachment.getCreated() != null ? attachment.getCreated().toString() : null;
this.modified = attachment.getModified() != null ? attachment.getModified().toString() : null;
this.classificationSummaryResource = new ClassificationSummaryResource(attachment.getClassificationSummary());
this.objectReference = attachment.getObjectReference();
this.channel = attachment.getChannel();
this.received = attachment.getReceived() != null ? attachment.getReceived().toString() : null;
this.customAttributes = attachment.getCustomAttributes();
}
public String getCreated() {
return created;
}

View File

@ -0,0 +1,51 @@
package pro.taskana.rest.resource;
import static org.springframework.hateoas.mvc.ControllerLinkBuilder.linkTo;
import java.util.List;
import java.util.stream.Collectors;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.hateoas.mvc.ResourceAssemblerSupport;
import org.springframework.stereotype.Component;
import pro.taskana.Attachment;
import pro.taskana.TaskService;
import pro.taskana.impl.AttachmentImpl;
import pro.taskana.rest.AttachmentController;
/**
* Resource assembler for {@link AttachmentResource}.
*/
@Component
public class AttachmentResourceAssembler extends ResourceAssemblerSupport<Attachment, AttachmentResource> {
@Autowired
private TaskService taskService;
@Autowired
private ClassificationSummaryResourceAssembler classificationAssembler;
public AttachmentResourceAssembler() {
super(AttachmentController.class, AttachmentResource.class);
}
@Override
public AttachmentResource toResource(Attachment attachment) {
AttachmentResource resource = new AttachmentResource(attachment);
resource.add(linkTo(AttachmentController.class).slash(attachment.getId()).withSelfRel());
return resource;
}
public List<Attachment> toModel(List<AttachmentResource> resources) {
return resources.stream().map(attachmentResource -> {
AttachmentImpl attachment = (AttachmentImpl) taskService.newAttachment();
BeanUtils.copyProperties(attachmentResource, attachment);
attachment.setId(attachmentResource.getAttachmentId());
attachment.setClassificationSummary(
classificationAssembler.toModel(attachmentResource.getClassificationSummary()));
return attachment;
}).collect(Collectors.toList());
}
}

View File

@ -1,63 +0,0 @@
package pro.taskana.rest.resource;
import java.util.ArrayList;
import java.util.List;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import pro.taskana.Attachment;
import pro.taskana.TaskService;
import pro.taskana.impl.AttachmentImpl;
/**
* Resource assembler for {@link AttachmentResource}.
*/
@Component
public class AttachmentResourcesAssembler {
@Autowired
private TaskService taskService;
@Autowired
private ClassificationSummaryResourceAssembler classificationAssembler;
public List<AttachmentResource> toResources(List<Attachment> attachments) {
List<AttachmentResource> resourceList = new ArrayList<>();
for (Attachment a : attachments) {
AttachmentResource resource = new AttachmentResource();
BeanUtils.copyProperties(a, resource);
if (a.getCreated() != null) {
resource.setCreated(a.getCreated().toString());
}
if (a.getModified() != null) {
resource.setModified(a.getModified().toString());
}
if (a.getReceived() != null) {
resource.setReceived(a.getReceived().toString());
}
resource.setAttachmentId(a.getId());
resource.setClassificationSummary(
classificationAssembler.toResource(a.getClassificationSummary()));
resourceList.add(resource);
}
return resourceList;
}
public List<Attachment> toModel(List<AttachmentResource> resources) {
List<Attachment> attachmentList = new ArrayList<>();
for (AttachmentResource ar : resources) {
AttachmentImpl attachment = (AttachmentImpl) taskService.newAttachment();
BeanUtils.copyProperties(ar, attachment);
attachment.setId(ar.getAttachmentId());
attachment.setClassificationSummary(
classificationAssembler.toModel(ar.getClassificationSummary()));
attachmentList.add(attachment);
}
return attachmentList;
}
}

View File

@ -2,6 +2,7 @@ package pro.taskana.rest.resource;
import org.springframework.hateoas.ResourceSupport;
import pro.taskana.AttachmentSummary;
import pro.taskana.ObjectReference;
/**
@ -12,12 +13,27 @@ public class AttachmentSummaryResource extends ResourceSupport {
private String attachmentId;
private String taskId;
private String created;
private String modified;
private String modified;
private ClassificationSummaryResource classificationSummaryResource;
private ObjectReference objectReference;
private String channel;
private String received;
AttachmentSummaryResource() {
}
public AttachmentSummaryResource(AttachmentSummary attachmentSummary) {
this.attachmentId = attachmentSummary.getId();
this.taskId = attachmentSummary.getTaskId();
this.created = attachmentSummary.getCreated() != null ? attachmentSummary.getCreated().toString() : null;
this.modified = attachmentSummary.getModified() != null ? attachmentSummary.getModified().toString() : null;
this.classificationSummaryResource = new ClassificationSummaryResource(
attachmentSummary.getClassificationSummary());
this.objectReference = attachmentSummary.getObjectReference();
this.channel = attachmentSummary.getChannel();
this.received = attachmentSummary.getReceived() != null ? attachmentSummary.getReceived().toString() : null;
}
public String getAttachmentId() {
return attachmentId;
}
@ -41,6 +57,7 @@ public class AttachmentSummaryResource extends ResourceSupport {
public void setCreated(String created) {
this.created = created;
}
public String getModified() {
return modified;
}

View File

@ -1,6 +1,7 @@
package pro.taskana.rest.resource;
import org.springframework.beans.BeanUtils;
import java.util.List;
import org.springframework.hateoas.mvc.ResourceAssemblerSupport;
import org.springframework.stereotype.Component;
@ -20,19 +21,12 @@ public class AttachmentSummaryResourceAssembler
@Override
public AttachmentSummaryResource toResource(AttachmentSummary attachmentSummary) {
AttachmentSummaryResource resource = createResourceWithId(attachmentSummary.getId(),
attachmentSummary);
BeanUtils.copyProperties(attachmentSummary, resource);
if (attachmentSummary.getCreated() != null) {
resource.setCreated(attachmentSummary.getCreated().toString());
}
if (attachmentSummary.getModified() != null) {
resource.setModified(attachmentSummary.getModified().toString());
}
if (attachmentSummary.getReceived() != null) {
resource.setReceived(attachmentSummary.getReceived().toString());
}
resource.setAttachmentId(attachmentSummary.getId());
return resource;
return new AttachmentSummaryResource(attachmentSummary);
}
public List<AttachmentSummaryResource> toResources(
List<AttachmentSummary> attachmentSummaries) {
List<AttachmentSummaryResource> resources = super.toResources(attachmentSummaries);
return resources;
}
}

View File

@ -1,17 +0,0 @@
package pro.taskana.rest.resource;
import java.util.List;
import pro.taskana.AttachmentSummary;
/**
* Resources assembler for {@link AttachmentSummaryResource}.
*/
public class AttachmentSummaryResourcesAssembler {
public List<AttachmentSummaryResource> toResources(
List<AttachmentSummary> attachmentSummaries) {
AttachmentSummaryResourceAssembler assembler = new AttachmentSummaryResourceAssembler();
List<AttachmentSummaryResource> resources = assembler.toResources(attachmentSummaries);
return resources;
}
}

View File

@ -1,13 +1,19 @@
package pro.taskana.rest.resource;
import javax.validation.constraints.NotNull;
import org.springframework.hateoas.ResourceSupport;
import pro.taskana.Classification;
/**
* Resource class for {@link pro.taskana.Classification}.
*/
public class ClassificationResource extends ResourceSupport {
@NotNull
public String classificationId;
@NotNull
public String key;
public String parentId;
public String parentKey;
@ -31,12 +37,33 @@ public class ClassificationResource extends ResourceSupport {
public String custom7;
public String custom8;
public Boolean getIsValidInDomain() {
return isValidInDomain;
public ClassificationResource() {
}
public void setIsValidInDomain(Boolean isValidInDomain) {
this.isValidInDomain = isValidInDomain;
public ClassificationResource(Classification classification) {
this.classificationId = classification.getId();
this.key = classification.getKey();
this.parentId = classification.getParentId();
this.parentKey = classification.getParentKey();
this.category = classification.getCategory();
this.type = classification.getType();
this.domain = classification.getDomain();
this.isValidInDomain = classification.getIsValidInDomain();
this.created = classification.getCreated() != null ? classification.getCreated().toString() : null;
this.modified = classification.getModified() != null ? classification.getModified().toString() : null;
this.name = classification.getName();
this.description = classification.getDescription();
this.priority = classification.getPriority();
this.serviceLevel = classification.getServiceLevel();
this.applicationEntryPoint = classification.getApplicationEntryPoint();
this.custom1 = classification.getCustom1();
this.custom2 = classification.getCustom2();
this.custom3 = classification.getCustom3();
this.custom4 = classification.getCustom4();
this.custom5 = classification.getCustom5();
this.custom6 = classification.getCustom6();
this.custom7 = classification.getCustom7();
this.custom8 = classification.getCustom8();
}
public String getClassificationId() {
@ -95,6 +122,14 @@ public class ClassificationResource extends ResourceSupport {
this.domain = domain;
}
public Boolean getIsValidInDomain() {
return isValidInDomain;
}
public void setIsValidInDomain(Boolean validInDomain) {
isValidInDomain = validInDomain;
}
public String getCreated() {
return created;
}

View File

@ -1,22 +1,16 @@
package pro.taskana.rest.resource;
import static org.springframework.hateoas.mvc.ControllerLinkBuilder.linkTo;
import static org.springframework.hateoas.mvc.ControllerLinkBuilder.methodOn;
import java.time.Instant;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.hateoas.mvc.ResourceAssemblerSupport;
import org.springframework.stereotype.Component;
import pro.taskana.Classification;
import pro.taskana.ClassificationService;
import pro.taskana.exceptions.ClassificationAlreadyExistException;
import pro.taskana.exceptions.ClassificationNotFoundException;
import pro.taskana.exceptions.ConcurrencyException;
import pro.taskana.exceptions.DomainNotFoundException;
import pro.taskana.exceptions.InvalidArgumentException;
import pro.taskana.exceptions.NotAuthorizedException;
import pro.taskana.impl.ClassificationImpl;
import pro.taskana.rest.ClassificationController;
@ -24,22 +18,24 @@ import pro.taskana.rest.ClassificationController;
* Transforms {@link Classification} to its resource counterpart {@link ClassificationResource} and vice versa.
*/
@Component
public class ClassificationResourceAssembler {
public class ClassificationResourceAssembler extends ResourceAssemblerSupport<Classification, ClassificationResource> {
@Autowired
ClassificationService classificationService;
public ClassificationResource toResource(Classification classification)
throws InvalidArgumentException, ConcurrencyException, ClassificationNotFoundException, DomainNotFoundException,
ClassificationAlreadyExistException, NotAuthorizedException {
return this.createResource(classification);
public ClassificationResourceAssembler() {
super(ClassificationController.class, ClassificationResource.class);
}
public ClassificationResource toDefinition(Classification classification)
throws InvalidArgumentException, ConcurrencyException, ClassificationNotFoundException, DomainNotFoundException,
ClassificationAlreadyExistException, NotAuthorizedException {
ClassificationResource resource = this.createResource(classification);
resource.removeLinks();
public ClassificationResource toResource(Classification classification) {
ClassificationResource resource = new ClassificationResource(classification);
resource.add(linkTo(ClassificationController.class).slash(classification.getId()).withSelfRel());
return resource;
}
public ClassificationResource toDefinition(Classification classification) {
ClassificationResource resource = new ClassificationResource(classification);
resource.add(linkTo(ClassificationController.class).slash(classification.getId()).withSelfRel());
return resource;
}
@ -58,28 +54,4 @@ public class ClassificationResourceAssembler {
return classification;
}
private ClassificationResource createResource(Classification classification)
throws NotAuthorizedException, ConcurrencyException, InvalidArgumentException, DomainNotFoundException,
ClassificationAlreadyExistException, ClassificationNotFoundException {
ClassificationResource resource = new ClassificationResource();
BeanUtils.copyProperties(classification, resource);
// need to be set by hand, because they are named different, or have different types
resource.setClassificationId(classification.getId());
if (classification.getCreated() != null) {
resource.setCreated(classification.getCreated().toString());
}
if (classification.getModified() != null) {
resource.setModified(classification.getModified().toString());
}
return addLinks(resource, classification);
}
private ClassificationResource addLinks(ClassificationResource resource, Classification classification)
throws ClassificationNotFoundException, NotAuthorizedException, ClassificationAlreadyExistException,
ConcurrencyException, DomainNotFoundException, InvalidArgumentException {
resource.add(
linkTo(methodOn(ClassificationController.class).getClassification(classification.getId()))
.withSelfRel());
return resource;
}
}

View File

@ -2,8 +2,10 @@ package pro.taskana.rest.resource;
import org.springframework.hateoas.ResourceSupport;
import pro.taskana.ClassificationSummary;
/**
* Resource class for {@link pro.taskana.Classification}.
* Resource class for {@link pro.taskana.ClassificationSummary}.
*/
public class ClassificationSummaryResource extends ResourceSupport {
@ -25,6 +27,29 @@ public class ClassificationSummaryResource extends ResourceSupport {
public String custom7;
public String custom8;
ClassificationSummaryResource() {
}
public ClassificationSummaryResource(ClassificationSummary classification) {
classificationId = classification.getId();
key = classification.getKey();
parentId = classification.getParentId();
parentKey = classification.getParentKey();
category = classification.getCategory();
type = classification.getType();
domain = classification.getDomain();
name = classification.getName();
priority = classification.getPriority();
custom1 = classification.getCustom1();
custom2 = classification.getCustom2();
custom3 = classification.getCustom3();
custom4 = classification.getCustom4();
custom5 = classification.getCustom5();
custom6 = classification.getCustom6();
custom7 = classification.getCustom7();
custom8 = classification.getCustom8();
}
public String getClassificationId() {
return classificationId;
}

View File

@ -1,7 +1,10 @@
package pro.taskana.rest.resource;
import java.util.Collection;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.hateoas.PagedResources;
import org.springframework.hateoas.mvc.ResourceAssemblerSupport;
import org.springframework.stereotype.Component;
@ -9,6 +12,7 @@ import pro.taskana.ClassificationService;
import pro.taskana.ClassificationSummary;
import pro.taskana.impl.ClassificationImpl;
import pro.taskana.rest.ClassificationController;
import pro.taskana.rest.resource.links.PageLinks;
/**
* Resource assembler for {@link ClassificationSummaryResource}.
@ -26,12 +30,7 @@ public class ClassificationSummaryResourceAssembler
@Override
public ClassificationSummaryResource toResource(ClassificationSummary classificationSummary) {
ClassificationSummaryResource resource = createResourceWithId(classificationSummary.getId(),
classificationSummary);
BeanUtils.copyProperties(classificationSummary, resource);
// named different so needs to be set by hand
resource.setClassificationId(classificationSummary.getId());
return resource;
return new ClassificationSummaryResource(classificationSummary);
}
public ClassificationSummary toModel(ClassificationSummaryResource resource) {
@ -44,4 +43,9 @@ public class ClassificationSummaryResourceAssembler
return classification.asSummary();
}
@PageLinks(ClassificationController.class)
public PagedResources<ClassificationSummaryResource> toResources(Collection<ClassificationSummary> entities,
PagedResources.PageMetadata pageMetadata) {
return new PagedResources<>(toResources(entities), pageMetadata);
}
}

View File

@ -1,56 +0,0 @@
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.hateoas.PagedResources.PageMetadata;
import org.springframework.web.util.UriComponentsBuilder;
import pro.taskana.ClassificationSummary;
import pro.taskana.rest.ClassificationController;
/**
* @author HH
*/
public class ClassificationSummaryResourcesAssembler {
public ClassificationSummaryResourcesAssembler() {
}
public PagedResources<ClassificationSummaryResource> toResources(
List<ClassificationSummary> classificationSummaries,
PageMetadata pageMetadata) {
ClassificationSummaryResourceAssembler assembler = new ClassificationSummaryResourceAssembler();
List<ClassificationSummaryResource> resources = assembler.toResources(classificationSummaries);
PagedResources<ClassificationSummaryResource> pagedResources = new PagedResources<ClassificationSummaryResource>(
resources,
pageMetadata);
UriComponentsBuilder original = getBuilderForOriginalUri();
pagedResources.add(new Link(original.toUriString()).withSelfRel());
if (pageMetadata != null) {
pagedResources.add(linkTo(ClassificationController.class).withRel("allClassifications"));
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;
}
}

View File

@ -1,46 +0,0 @@
package pro.taskana.rest.resource;
import static org.springframework.hateoas.mvc.ControllerLinkBuilder.linkTo;
import static org.springframework.hateoas.mvc.ControllerLinkBuilder.methodOn;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.hateoas.Resources;
import org.springframework.stereotype.Component;
import pro.taskana.WorkbasketSummary;
import pro.taskana.exceptions.NotAuthorizedException;
import pro.taskana.exceptions.WorkbasketNotFoundException;
import pro.taskana.rest.WorkbasketController;
/**
* Mapper to convert from a list of WorkbasketSummary to a workbasket list resource.
*/
@Component
public class DistributionTargetListAssembler {
@Autowired
private DistributionTargetResourceAssembler distributionTargetResourceAssembler;
public Resources<DistributionTargetResource> toResource(String workbasketId,
Collection<WorkbasketSummary> distributionTargets) throws WorkbasketNotFoundException, NotAuthorizedException {
List<DistributionTargetResource> resourceList = new ArrayList<>();
for (WorkbasketSummary wb : distributionTargets) {
resourceList.add(distributionTargetResourceAssembler.toResource(wb));
}
Resources<DistributionTargetResource> distributionTargetListResource = new Resources<>(resourceList);
distributionTargetListResource
.add(linkTo(methodOn(WorkbasketController.class).getDistributionTargets(workbasketId))
.withSelfRel());
distributionTargetListResource
.add(linkTo(methodOn(WorkbasketController.class).getWorkbasket(workbasketId))
.withRel("workbasket"));
return distributionTargetListResource;
}
}

View File

@ -2,10 +2,18 @@ package pro.taskana.rest.resource;
import org.springframework.hateoas.core.Relation;
import pro.taskana.WorkbasketSummary;
/**
* Resource class for a distribution target based on {@link pro.taskana.WorkbasketSummary}.
*/
@Relation(collectionRelation = "distributionTargets")
public class DistributionTargetResource extends WorkbasketSummaryResource {
DistributionTargetResource() {
}
DistributionTargetResource(WorkbasketSummary workbasketSummary) {
super(workbasketSummary);
}
}

View File

@ -3,7 +3,10 @@ package pro.taskana.rest.resource;
import static org.springframework.hateoas.mvc.ControllerLinkBuilder.linkTo;
import static org.springframework.hateoas.mvc.ControllerLinkBuilder.methodOn;
import org.springframework.beans.BeanUtils;
import java.util.List;
import org.springframework.hateoas.Resources;
import org.springframework.hateoas.mvc.ResourceAssemblerSupport;
import org.springframework.stereotype.Component;
import pro.taskana.WorkbasketSummary;
@ -15,21 +18,28 @@ import pro.taskana.rest.WorkbasketController;
* Transforms WorkbasketSummary to its resource counterpart DistributionTargerResource and vice versa.
*/
@Component
public class DistributionTargetResourceAssembler {
public class DistributionTargetResourceAssembler extends
ResourceAssemblerSupport<WorkbasketSummary, DistributionTargetResource> {
public DistributionTargetResource toResource(WorkbasketSummary summary)
throws WorkbasketNotFoundException, NotAuthorizedException {
DistributionTargetResource resource = new DistributionTargetResource();
BeanUtils.copyProperties(summary, resource);
// named different so needs to be set by hand
resource.setWorkbasketId(summary.getId());
return addLinks(resource, summary);
public DistributionTargetResourceAssembler() {
super(WorkbasketController.class, DistributionTargetResource.class);
}
private DistributionTargetResource addLinks(DistributionTargetResource resource, WorkbasketSummary summary)
throws WorkbasketNotFoundException, NotAuthorizedException {
resource.add(linkTo(methodOn(WorkbasketController.class).getWorkbasket(summary.getId())).withSelfRel());
return resource;
public DistributionTargetResource toResource(WorkbasketSummary summary) {
return new DistributionTargetResource(summary);
}
public Resources<DistributionTargetResource> toResources(String workbasketId,
List<WorkbasketSummary> distributionTargets) throws WorkbasketNotFoundException, NotAuthorizedException {
Resources<DistributionTargetResource> distributionTargetListResource = new Resources<>(super.toResources(distributionTargets));
distributionTargetListResource
.add(linkTo(methodOn(WorkbasketController.class).getDistributionTargets(workbasketId))
.withSelfRel());
distributionTargetListResource
.add(linkTo(methodOn(WorkbasketController.class).getWorkbasket(workbasketId))
.withRel("workbasket"));
return distributionTargetListResource;
}
}

View File

@ -32,7 +32,7 @@ import pro.taskana.rest.MonitorController;
* Transforms any {@link Report} into its {@link ReportResource}.
*/
@Component
public class ReportAssembler {
public class ReportResourceAssembler {
public ReportResource toResource(TaskStatusReport report, List<String> domains, List<TaskState> states)
throws NotAuthorizedException, InvalidArgumentException {

View File

@ -3,11 +3,14 @@ package pro.taskana.rest.resource;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;
import org.springframework.hateoas.ResourceSupport;
import pro.taskana.ObjectReference;
import pro.taskana.Task;
import pro.taskana.TaskState;
import pro.taskana.exceptions.InvalidArgumentException;
/**
* Resource class for {@link pro.taskana.Task}.
@ -57,6 +60,64 @@ public class TaskResource extends ResourceSupport {
private String custom15;
private String custom16;
public TaskResource() {
}
public TaskResource(Task task) throws InvalidArgumentException {
taskId = task.getId();
externalId = task.getExternalId();
created = task.getCreated() != null ? task.getCreated().toString() : null;
claimed = task.getClaimed() != null ? task.getClaimed().toString() : null;
completed = task.getCompleted() != null ? task.getCompleted().toString() : null;
modified = task.getModified() != null ? task.getModified().toString() : null;
planned = task.getPlanned() != null ? task.getPlanned().toString() : null;
due = task.getDue() != null ? task.getDue().toString() : null;
name = task.getName();
creator = task.getCreator();
description = task.getDescription();
note = task.getNote();
priority = task.getPriority();
state = task.getState();
classificationSummaryResource = new ClassificationSummaryResource(task.getClassificationSummary());
workbasketSummaryResource = new WorkbasketSummaryResource(task.getWorkbasketSummary());
businessProcessId = task.getBusinessProcessId();
parentBusinessProcessId = task.getParentBusinessProcessId();
owner = task.getOwner();
primaryObjRef = task.getPrimaryObjRef();
isRead = task.isRead();
isTransferred = task.isTransferred();
customAttributes = task.getCustomAttributes().entrySet().stream()
.map(e -> new TaskResource.CustomAttribute(e.getKey(), e.getValue()))
.collect(Collectors.toList());
callbackInfo = task.getCallbackInfo().entrySet().stream()
.map(e -> new TaskResource.CustomAttribute(e.getKey(), e.getValue()))
.collect(Collectors.toList());
attachments =
task.getAttachments()
.stream()
.map(attachment -> new AttachmentResource(attachment))
.collect(Collectors.toList());
custom1 = task.getCustomAttribute("1");
custom2 = task.getCustomAttribute("2");
custom3 = task.getCustomAttribute("3");
custom4 = task.getCustomAttribute("4");
custom5 = task.getCustomAttribute("5");
custom6 = task.getCustomAttribute("6");
custom7 = task.getCustomAttribute("7");
custom8 = task.getCustomAttribute("8");
custom9 = task.getCustomAttribute("9");
custom10 = task.getCustomAttribute("10");
custom11 = task.getCustomAttribute("11");
custom12 = task.getCustomAttribute("12");
custom13 = task.getCustomAttribute("13");
custom14 = task.getCustomAttribute("14");
custom15 = task.getCustomAttribute("15");
custom16 = task.getCustomAttribute("16");
}
public String getTaskId() {
return taskId;
}

View File

@ -1,5 +1,7 @@
package pro.taskana.rest.resource;
import static org.springframework.hateoas.mvc.ControllerLinkBuilder.linkTo;
import java.time.Instant;
import java.util.Objects;
import java.util.stream.Collectors;
@ -33,7 +35,7 @@ public class TaskResourceAssembler
private WorkbasketSummaryResourceAssembler workbasketAssembler;
@Autowired
private AttachmentResourcesAssembler attachmentAssembler;
private AttachmentResourceAssembler attachmentAssembler;
public TaskResourceAssembler() {
super(TaskController.class, TaskResource.class);
@ -41,88 +43,13 @@ public class TaskResourceAssembler
@Override
public TaskResource toResource(Task task) {
TaskResource resource = createResourceWithId(task.getId(), task);
BeanUtils.copyProperties(task, resource);
resource.setTaskId(task.getId());
resource.setExternalId(task.getExternalId());
if (task.getCreated() != null) {
resource.setCreated(task.getCreated().toString());
}
if (task.getModified() != null) {
resource.setModified(task.getModified().toString());
}
if (task.getClaimed() != null) {
resource.setClaimed(task.getClaimed().toString());
}
if (task.getCompleted() != null) {
resource.setCompleted(task.getCompleted().toString());
}
if (task.getDue() != null) {
resource.setDue(task.getDue().toString());
}
resource.setClassificationSummaryResource(
classificationAssembler.toResource(task.getClassificationSummary()));
resource.setWorkbasketSummaryResource(workbasketAssembler.toResource(task.getWorkbasketSummary()));
resource.setAttachments(attachmentAssembler.toResources(task.getAttachments()));
resource.setCustomAttributes(task.getCustomAttributes().entrySet().stream()
.map(e -> new TaskResource.CustomAttribute(e.getKey(), e.getValue()))
.collect(Collectors.toList()));
resource.setCallbackInfo(task.getCallbackInfo().entrySet().stream()
.map(e -> new TaskResource.CustomAttribute(e.getKey(), e.getValue()))
.collect(Collectors.toList()));
TaskResource resource;
try {
if (task.getCustomAttribute("1") != null) {
resource.setCustom1(task.getCustomAttribute("1"));
}
if (task.getCustomAttribute("2") != null) {
resource.setCustom2(task.getCustomAttribute("2"));
}
if (task.getCustomAttribute("3") != null) {
resource.setCustom3(task.getCustomAttribute("3"));
}
if (task.getCustomAttribute("4") != null) {
resource.setCustom4(task.getCustomAttribute("4"));
}
if (task.getCustomAttribute("5") != null) {
resource.setCustom5(task.getCustomAttribute("5"));
}
if (task.getCustomAttribute("6") != null) {
resource.setCustom6(task.getCustomAttribute("6"));
}
if (task.getCustomAttribute("7") != null) {
resource.setCustom7(task.getCustomAttribute("7"));
}
if (task.getCustomAttribute("8") != null) {
resource.setCustom8(task.getCustomAttribute("8"));
}
if (task.getCustomAttribute("8") != null) {
resource.setCustom9(task.getCustomAttribute("9"));
}
if (task.getCustomAttribute("10") != null) {
resource.setCustom10(task.getCustomAttribute("10"));
}
if (task.getCustomAttribute("11") != null) {
resource.setCustom11(task.getCustomAttribute("11"));
}
if (task.getCustomAttribute("12") != null) {
resource.setCustom12(task.getCustomAttribute("12"));
}
if (task.getCustomAttribute("13") != null) {
resource.setCustom13(task.getCustomAttribute("13"));
}
if (task.getCustomAttribute("14") != null) {
resource.setCustom14(task.getCustomAttribute("14"));
}
if (task.getCustomAttribute("15") != null) {
resource.setCustom15(task.getCustomAttribute("15"));
}
if (task.getCustomAttribute("16") != null) {
resource.setCustom16(task.getCustomAttribute("16"));
}
resource = new TaskResource(task);
resource.add(linkTo(TaskController.class).slash(task.getId()).withSelfRel());
} catch (InvalidArgumentException e) {
throw new SystemException("caught unexpected Exception.", e.getCause());
}
return resource;
}
@ -156,54 +83,6 @@ public class TaskResourceAssembler
task.setCallbackInfo(resource.getCallbackInfo().stream()
.filter(e -> Objects.nonNull(e.getKey()) && !e.getKey().isEmpty())
.collect(Collectors.toMap(TaskResource.CustomAttribute::getKey, TaskResource.CustomAttribute::getValue)));
if (resource.getCustom1() != null) {
task.setCustom1(resource.getCustom1());
}
if (resource.getCustom2() != null) {
task.setCustom2(resource.getCustom2());
}
if (resource.getCustom3() != null) {
task.setCustom3(resource.getCustom3());
}
if (resource.getCustom4() != null) {
task.setCustom4(resource.getCustom4());
}
if (resource.getCustom5() != null) {
task.setCustom5(resource.getCustom5());
}
if (resource.getCustom6() != null) {
task.setCustom6(resource.getCustom6());
}
if (resource.getCustom7() != null) {
task.setCustom7(resource.getCustom7());
}
if (resource.getCustom8() != null) {
task.setCustom8(resource.getCustom8());
}
if (resource.getCustom9() != null) {
task.setCustom9(resource.getCustom9());
}
if (resource.getCustom10() != null) {
task.setCustom10(resource.getCustom10());
}
if (resource.getCustom11() != null) {
task.setCustom11(resource.getCustom11());
}
if (resource.getCustom12() != null) {
task.setCustom12(resource.getCustom12());
}
if (resource.getCustom13() != null) {
task.setCustom13(resource.getCustom13());
}
if (resource.getCustom14() != null) {
task.setCustom14(resource.getCustom14());
}
if (resource.getCustom15() != null) {
task.setCustom15(resource.getCustom15());
}
if (resource.getCustom16() != null) {
task.setCustom16(resource.getCustom16());
}
return task;
}

View File

@ -1,15 +1,16 @@
package pro.taskana.rest.resource;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import org.springframework.hateoas.ResourceSupport;
import org.springframework.hateoas.core.Relation;
import pro.taskana.ObjectReference;
import pro.taskana.TaskState;
import pro.taskana.TaskSummary;
import pro.taskana.exceptions.InvalidArgumentException;
/**
* Resource class for {@link pro.taskana.WorkbasketSummary}.
@ -27,7 +28,6 @@ public class TaskSummaryResource extends ResourceSupport {
private String due; // ISO-8601
private String name;
private String creator;
private String description;
private String note;
private int priority;
private TaskState state;
@ -39,8 +39,6 @@ public class TaskSummaryResource extends ResourceSupport {
private ObjectReference primaryObjRef;
private boolean isRead;
private boolean isTransferred;
// All objects have to be serializable
private Map<String, String> customAttributes = Collections.emptyMap();
private List<AttachmentSummaryResource> attachmentSummaryResources = new ArrayList<>();
private String custom1;
private String custom2;
@ -59,6 +57,53 @@ public class TaskSummaryResource extends ResourceSupport {
private String custom15;
private String custom16;
TaskSummaryResource() {
}
public TaskSummaryResource(TaskSummary taskSummary) throws InvalidArgumentException {
this.taskId = taskSummary.getTaskId();
this.externalId = taskSummary.getExternalId();
created = taskSummary.getCreated() != null ? taskSummary.getCreated().toString() : null;
claimed = taskSummary.getClaimed() != null ? taskSummary.getClaimed().toString() : null;
completed = taskSummary.getCompleted() != null ? taskSummary.getCompleted().toString() : null;
modified = taskSummary.getModified() != null ? taskSummary.getModified().toString() : null;
planned = taskSummary.getPlanned() != null ? taskSummary.getPlanned().toString() : null;
due = taskSummary.getDue() != null ? taskSummary.getDue().toString() : null;
this.name = taskSummary.getName();
this.creator = taskSummary.getCreator();
this.note = taskSummary.getNote();
this.priority = taskSummary.getPriority();
this.state = taskSummary.getState();
this.classificationSummaryResource = new ClassificationSummaryResource(taskSummary.getClassificationSummary());
this.workbasketSummaryResource = new WorkbasketSummaryResource(taskSummary.getWorkbasketSummary());
this.businessProcessId = taskSummary.getBusinessProcessId();
this.parentBusinessProcessId = taskSummary.getParentBusinessProcessId();
this.owner = taskSummary.getOwner();
this.primaryObjRef = taskSummary.getPrimaryObjRef();
this.isRead = taskSummary.isRead();
this.isTransferred = taskSummary.isTransferred();
this.attachmentSummaryResources = taskSummary.getAttachmentSummaries()
.stream()
.map(attachment -> new AttachmentSummaryResource(attachment))
.collect(Collectors.toList());
this.custom1 = taskSummary.getCustomAttribute("1");
this.custom2 = taskSummary.getCustomAttribute("2");
this.custom3 = taskSummary.getCustomAttribute("3");
this.custom4 = taskSummary.getCustomAttribute("4");
this.custom5 = taskSummary.getCustomAttribute("5");
this.custom6 = taskSummary.getCustomAttribute("6");
this.custom7 = taskSummary.getCustomAttribute("7");
this.custom8 = taskSummary.getCustomAttribute("8");
this.custom9 = taskSummary.getCustomAttribute("9");
this.custom10 = taskSummary.getCustomAttribute("10");
this.custom11 = taskSummary.getCustomAttribute("11");
this.custom12 = taskSummary.getCustomAttribute("12");
this.custom13 = taskSummary.getCustomAttribute("13");
this.custom14 = taskSummary.getCustomAttribute("14");
this.custom15 = taskSummary.getCustomAttribute("15");
this.custom16 = taskSummary.getCustomAttribute("16");
}
public String getTaskId() {
return taskId;
}
@ -139,14 +184,6 @@ public class TaskSummaryResource extends ResourceSupport {
this.creator = creator;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public String getNote() {
return note;
}
@ -235,14 +272,6 @@ public class TaskSummaryResource extends ResourceSupport {
this.isTransferred = isTransferred;
}
public Map<String, String> getCustomAttributes() {
return customAttributes;
}
public void setCustomAttributes(Map<String, String> customAttributes) {
this.customAttributes = customAttributes;
}
public List<AttachmentSummaryResource> getAttachmentSummaries() {
return attachmentSummaryResources;
}
@ -392,7 +421,6 @@ public class TaskSummaryResource extends ResourceSupport {
+ "due= " + this.due
+ "name= " + this.name
+ "creator= " + this.creator
+ "description= " + this.description
+ "priority= " + this.priority
+ "owner= " + this.owner
+ "]";

View File

@ -1,104 +1,44 @@
package pro.taskana.rest.resource;
import org.springframework.beans.BeanUtils;
import java.util.List;
import org.springframework.hateoas.PagedResources;
import org.springframework.hateoas.mvc.ResourceAssemblerSupport;
import org.springframework.stereotype.Component;
import pro.taskana.TaskSummary;
import pro.taskana.exceptions.InvalidArgumentException;
import pro.taskana.exceptions.SystemException;
import pro.taskana.rest.TaskController;
import pro.taskana.rest.resource.links.PageLinks;
/**
* Resource assembler for {@link TaskSummaryResource}.
*/
@Component
public class TaskSummaryResourceAssembler
extends ResourceAssemblerSupport<TaskSummary, TaskSummaryResource> {
private WorkbasketSummaryResourceAssembler workbasketAssembler = new WorkbasketSummaryResourceAssembler();
private ClassificationSummaryResourceAssembler classificationAssembler = new ClassificationSummaryResourceAssembler();
private AttachmentSummaryResourcesAssembler attachmentsAssembler = new AttachmentSummaryResourcesAssembler();
public TaskSummaryResourceAssembler() {
super(TaskController.class, TaskSummaryResource.class);
}
@Override
public TaskSummaryResource toResource(TaskSummary taskSummary) {
TaskSummaryResource resource = createResourceWithId(taskSummary.getTaskId(), taskSummary);
BeanUtils.copyProperties(taskSummary, resource);
if (taskSummary.getCreated() != null) {
resource.setCreated(taskSummary.getCreated().toString());
}
if (taskSummary.getModified() != null) {
resource.setModified(taskSummary.getModified().toString());
}
if (taskSummary.getClaimed() != null) {
resource.setClaimed(taskSummary.getClaimed().toString());
}
if (taskSummary.getCompleted() != null) {
resource.setCompleted(taskSummary.getCompleted().toString());
}
if (taskSummary.getDue() != null) {
resource.setDue(taskSummary.getDue().toString());
}
resource.setClassificationSummaryResource(
classificationAssembler.toResource(taskSummary.getClassificationSummary()));
resource.setWorkbasketSummaryResource(workbasketAssembler.toResource(taskSummary.getWorkbasketSummary()));
resource.setAttachmentSummaries(attachmentsAssembler.toResources(taskSummary.getAttachmentSummaries()));
TaskSummaryResource resource = null;
try {
if (taskSummary.getCustomAttribute("1") != null) {
resource.setCustom1(taskSummary.getCustomAttribute("1"));
}
if (taskSummary.getCustomAttribute("2") != null) {
resource.setCustom2(taskSummary.getCustomAttribute("2"));
}
if (taskSummary.getCustomAttribute("3") != null) {
resource.setCustom3(taskSummary.getCustomAttribute("3"));
}
if (taskSummary.getCustomAttribute("4") != null) {
resource.setCustom4(taskSummary.getCustomAttribute("4"));
}
if (taskSummary.getCustomAttribute("5") != null) {
resource.setCustom5(taskSummary.getCustomAttribute("5"));
}
if (taskSummary.getCustomAttribute("6") != null) {
resource.setCustom6(taskSummary.getCustomAttribute("6"));
}
if (taskSummary.getCustomAttribute("7") != null) {
resource.setCustom7(taskSummary.getCustomAttribute("7"));
}
if (taskSummary.getCustomAttribute("8") != null) {
resource.setCustom8(taskSummary.getCustomAttribute("8"));
}
if (taskSummary.getCustomAttribute("8") != null) {
resource.setCustom9(taskSummary.getCustomAttribute("9"));
}
if (taskSummary.getCustomAttribute("10") != null) {
resource.setCustom10(taskSummary.getCustomAttribute("10"));
}
if (taskSummary.getCustomAttribute("11") != null) {
resource.setCustom11(taskSummary.getCustomAttribute("11"));
}
if (taskSummary.getCustomAttribute("12") != null) {
resource.setCustom12(taskSummary.getCustomAttribute("12"));
}
if (taskSummary.getCustomAttribute("13") != null) {
resource.setCustom13(taskSummary.getCustomAttribute("13"));
}
if (taskSummary.getCustomAttribute("14") != null) {
resource.setCustom14(taskSummary.getCustomAttribute("14"));
}
if (taskSummary.getCustomAttribute("15") != null) {
resource.setCustom15(taskSummary.getCustomAttribute("15"));
}
if (taskSummary.getCustomAttribute("16") != null) {
resource.setCustom16(taskSummary.getCustomAttribute("16"));
}
resource = new TaskSummaryResource(taskSummary);
} catch (InvalidArgumentException e) {
throw new SystemException("caught unexpected Exception.", e.getCause());
} finally {
return resource;
}
}
return resource;
@PageLinks(TaskController.class)
public PagedResources<TaskSummaryResource> toResources(List<TaskSummary> taskSummaries,
PagedResources.PageMetadata pageMetadata) {
return new PagedResources<>(toResources(taskSummaries), pageMetadata);
}
}

View File

@ -1,41 +0,0 @@
package pro.taskana.rest.resource;
import static org.springframework.hateoas.mvc.ControllerLinkBuilder.linkTo;
import java.util.List;
import org.springframework.hateoas.Link;
import org.springframework.hateoas.PagedResources;
import org.springframework.hateoas.PagedResources.PageMetadata;
import pro.taskana.TaskSummary;
import pro.taskana.rest.TaskController;
/**
* Resources assembler for {@link TaskSummaryResource}.
*/
public class TaskSummaryResourcesAssembler extends AbstractRessourcesAssembler {
public TaskSummaryResourcesAssembler() {
super();
}
public PagedResources<TaskSummaryResource> toResources(List<TaskSummary> taskSummaries,
PageMetadata pageMetadata) {
TaskSummaryResourceAssembler assembler = new TaskSummaryResourceAssembler();
List<TaskSummaryResource> resources = assembler.toResources(taskSummaries);
PagedResources<TaskSummaryResource> pagedResources = new PagedResources<TaskSummaryResource>(
resources,
pageMetadata);
pagedResources.add(new Link(original.toUriString()).withSelfRel());
if (pageMetadata != null) {
pagedResources.add(linkTo(TaskController.class).withRel("allTasks"));
addPageLinks(pagedResources, pageMetadata);
}
return pagedResources;
}
}

View File

@ -1,90 +0,0 @@
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.AbstractRessourcesAssembler.getBuilderForOriginalUri;
import java.util.List;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.hateoas.Link;
import org.springframework.hateoas.PagedResources;
import org.springframework.stereotype.Component;
import org.springframework.web.util.UriComponentsBuilder;
import pro.taskana.WorkbasketAccessItem;
import pro.taskana.WorkbasketService;
import pro.taskana.exceptions.NotAuthorizedException;
import pro.taskana.exceptions.WorkbasketNotFoundException;
import pro.taskana.impl.WorkbasketAccessItemImpl;
import pro.taskana.rest.WorkbasketController;
/**
* Transforms {@link WorkbasketAccessItem} to its resource counterpart {@link WorkbasketAccessItemResource} and vice
* versa.
*/
@Component
public class WorkbasketAccessItemAssembler {
@Autowired
private WorkbasketService workbasketService;
public WorkbasketAccessItemResource toResource(WorkbasketAccessItem wbAccItem)
throws NotAuthorizedException, WorkbasketNotFoundException {
WorkbasketAccessItemResource resource = new WorkbasketAccessItemResource();
BeanUtils.copyProperties(wbAccItem, resource);
// property is named different, so it needs to be set by hand
resource.setAccessItemId(wbAccItem.getId());
return addLinks(resource, wbAccItem);
}
public WorkbasketAccessItem toModel(WorkbasketAccessItemResource wbAccItemRecource) {
WorkbasketAccessItemImpl wbAccItemModel = (WorkbasketAccessItemImpl) workbasketService.newWorkbasketAccessItem(
wbAccItemRecource.workbasketId, wbAccItemRecource.accessId);
BeanUtils.copyProperties(wbAccItemRecource, wbAccItemModel);
wbAccItemModel.setId(wbAccItemRecource.accessItemId);
return wbAccItemModel;
}
private WorkbasketAccessItemResource addLinks(WorkbasketAccessItemResource resource, WorkbasketAccessItem wbAccItem)
throws NotAuthorizedException, WorkbasketNotFoundException {
resource.add(
linkTo(methodOn(WorkbasketController.class).getWorkbasket(wbAccItem.getWorkbasketId()))
.withRel("workbasket"));
return resource;
}
public PagedResources<WorkbasketAccessItemResource> toResources(List<WorkbasketAccessItem> workbasketAccessItems,
PagedResources.PageMetadata pageMetadata) {
WorkbasketAccessItemsAssembler assembler = new WorkbasketAccessItemsAssembler();
List<WorkbasketAccessItemResource> resources = assembler.toResources(workbasketAccessItems);
PagedResources<WorkbasketAccessItemResource> pagedResources = new PagedResources<WorkbasketAccessItemResource>(
resources,
pageMetadata);
UriComponentsBuilder original = getBuilderForOriginalUri();
pagedResources.add(new Link(original.toUriString()).withSelfRel());
if (pageMetadata != null) {
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;
}
}

View File

@ -1,47 +0,0 @@
package pro.taskana.rest.resource;
import static org.springframework.hateoas.mvc.ControllerLinkBuilder.linkTo;
import static org.springframework.hateoas.mvc.ControllerLinkBuilder.methodOn;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.hateoas.Resources;
import org.springframework.stereotype.Component;
import pro.taskana.WorkbasketAccessItem;
import pro.taskana.exceptions.NotAuthorizedException;
import pro.taskana.exceptions.WorkbasketNotFoundException;
import pro.taskana.rest.WorkbasketController;
/**
* Mapper to convert from a list of WorkbasketAccessItem to a WorkbasketAccessItemResource.
*/
@Component
public class WorkbasketAccessItemListAssembler {
@Autowired
private WorkbasketAccessItemAssembler workbasketAccessItemAssembler;
public Resources<WorkbasketAccessItemResource> toResource(String workbasketId,
Collection<WorkbasketAccessItem> accessItems) throws NotAuthorizedException, WorkbasketNotFoundException {
List<WorkbasketAccessItemResource> resourceList = new ArrayList<>();
for (WorkbasketAccessItem accessItem : accessItems) {
resourceList.add(workbasketAccessItemAssembler.toResource(accessItem));
}
Resources<WorkbasketAccessItemResource> accessItemListResource = new Resources<>(resourceList);
accessItemListResource
.add(linkTo(methodOn(WorkbasketController.class).getWorkbasketAccessItems(workbasketId))
.withSelfRel());
accessItemListResource
.add(linkTo(methodOn(WorkbasketController.class).getWorkbasket(workbasketId))
.withRel("workbasket"));
return accessItemListResource;
}
}

View File

@ -5,6 +5,8 @@ import javax.validation.constraints.NotNull;
import org.springframework.hateoas.ResourceSupport;
import org.springframework.hateoas.core.Relation;
import pro.taskana.WorkbasketAccessItem;
/**
* Resource class for {@link pro.taskana.WorkbasketAccessItem}.
*/
@ -42,6 +44,34 @@ public class WorkbasketAccessItemResource extends ResourceSupport {
public boolean permCustom11;
public boolean permCustom12;
public WorkbasketAccessItemResource() {
}
public WorkbasketAccessItemResource(WorkbasketAccessItem workbasketAccessItem) {
this.accessItemId = workbasketAccessItem.getId();
this.workbasketId = workbasketAccessItem.getWorkbasketId();
this.workbasketKey = workbasketAccessItem.getWorkbasketKey();
this.accessId = workbasketAccessItem.getAccessId();
this.accessName = workbasketAccessItem.getAccessName();
this.permRead = workbasketAccessItem.isPermRead();
this.permOpen = workbasketAccessItem.isPermOpen();
this.permAppend = workbasketAccessItem.isPermAppend();
this.permTransfer = workbasketAccessItem.isPermTransfer();
this.permDistribute = workbasketAccessItem.isPermDistribute();
this.permCustom1 = workbasketAccessItem.isPermCustom1();
this.permCustom2 = workbasketAccessItem.isPermCustom2();
this.permCustom3 = workbasketAccessItem.isPermCustom3();
this.permCustom4 = workbasketAccessItem.isPermCustom4();
this.permCustom5 = workbasketAccessItem.isPermCustom5();
this.permCustom6 = workbasketAccessItem.isPermCustom6();
this.permCustom7 = workbasketAccessItem.isPermCustom7();
this.permCustom8 = workbasketAccessItem.isPermCustom8();
this.permCustom9 = workbasketAccessItem.isPermCustom9();
this.permCustom10 = workbasketAccessItem.isPermCustom10();
this.permCustom11 = workbasketAccessItem.isPermCustom11();
this.permCustom12 = workbasketAccessItem.isPermCustom12();
}
public String getAccessItemId() {
return accessItemId;
}

View File

@ -0,0 +1,71 @@
package pro.taskana.rest.resource;
import static org.springframework.hateoas.mvc.ControllerLinkBuilder.linkTo;
import static org.springframework.hateoas.mvc.ControllerLinkBuilder.methodOn;
import java.util.List;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.hateoas.PagedResources;
import org.springframework.hateoas.Resources;
import org.springframework.hateoas.mvc.ResourceAssemblerSupport;
import org.springframework.stereotype.Component;
import pro.taskana.WorkbasketAccessItem;
import pro.taskana.WorkbasketService;
import pro.taskana.exceptions.NotAuthorizedException;
import pro.taskana.exceptions.WorkbasketNotFoundException;
import pro.taskana.impl.WorkbasketAccessItemImpl;
import pro.taskana.rest.WorkbasketAccessItemController;
import pro.taskana.rest.WorkbasketController;
import pro.taskana.rest.resource.links.PageLinks;
/**
* Transforms {@link WorkbasketAccessItem} to its resource counterpart {@link WorkbasketAccessItemResource} and vice
* versa.
*/
@Component
public class WorkbasketAccessItemResourceAssembler extends
ResourceAssemblerSupport<WorkbasketAccessItem, WorkbasketAccessItemResource> {
@Autowired
private WorkbasketService workbasketService;
public WorkbasketAccessItemResourceAssembler() {
super(WorkbasketController.class, WorkbasketAccessItemResource.class);
}
public WorkbasketAccessItemResource toResource(WorkbasketAccessItem wbAccItem) {
return new WorkbasketAccessItemResource(wbAccItem);
}
public WorkbasketAccessItem toModel(WorkbasketAccessItemResource wbAccItemResource) {
WorkbasketAccessItemImpl wbAccItemModel = (WorkbasketAccessItemImpl) workbasketService.newWorkbasketAccessItem(
wbAccItemResource.workbasketId, wbAccItemResource.accessId);
BeanUtils.copyProperties(wbAccItemResource, wbAccItemModel);
wbAccItemModel.setId(wbAccItemResource.accessItemId);
return wbAccItemModel;
}
@PageLinks(WorkbasketAccessItemController.class)
public PagedResources<WorkbasketAccessItemResource> toResources(List<WorkbasketAccessItem> entities,
PagedResources.PageMetadata pageMetadata) {
return new PagedResources<>(toResources(entities), pageMetadata);
}
public Resources<WorkbasketAccessItemResource> toResources(String workbasketId, List<WorkbasketAccessItem> entities)
throws NotAuthorizedException, WorkbasketNotFoundException {
Resources<WorkbasketAccessItemResource> accessItemListResource = new Resources<>(super.toResources(entities));
accessItemListResource
.add(linkTo(methodOn(WorkbasketController.class).getWorkbasketAccessItems(workbasketId))
.withSelfRel());
accessItemListResource
.add(linkTo(methodOn(WorkbasketController.class).getWorkbasket(workbasketId))
.withRel("workbasket"));
return accessItemListResource;
}
}

View File

@ -1,29 +0,0 @@
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;
/**
* Mapper to convert from a list of WorkbasketAccessItem to a WorkbasketAccessItemResource.
*/
public class WorkbasketAccessItemsAssembler
extends ResourceAssemblerSupport<WorkbasketAccessItem, WorkbasketAccessItemResource> {
public WorkbasketAccessItemsAssembler() {
super(WorkbasketAccessItemController.class, WorkbasketAccessItemResource.class);
}
@Override
public WorkbasketAccessItemResource toResource(WorkbasketAccessItem workbasketAccessItem) {
WorkbasketAccessItemResource resource = createResourceWithId(workbasketAccessItem.getId(),
workbasketAccessItem);
resource.removeLinks();
BeanUtils.copyProperties(workbasketAccessItem, resource);
resource.setAccessItemId(workbasketAccessItem.getId());
return resource;
}
}

View File

@ -44,11 +44,7 @@ public class WorkbasketDefinitionResourceAssembler {
public WorkbasketDefinitionResource toResource(Workbasket workbasket)
throws NotAuthorizedException, WorkbasketNotFoundException {
WorkbasketResourceWithoutLinks basket = new WorkbasketResourceWithoutLinks();
BeanUtils.copyProperties(workbasket, basket);
basket.setWorkbasketId(workbasket.getId());
basket.setModified(workbasket.getModified().toString());
basket.setCreated(workbasket.getCreated().toString());
WorkbasketResourceWithoutLinks basket = new WorkbasketResourceWithoutLinks(workbasket);
List<WorkbasketAccessItemImpl> authorizations = new ArrayList<>();
for (WorkbasketAccessItem accessItem : workbasketService.getWorkbasketAccessItems(basket.getWorkbasketId())) {

View File

@ -4,6 +4,7 @@ import javax.validation.constraints.NotNull;
import org.springframework.hateoas.ResourceSupport;
import pro.taskana.Workbasket;
import pro.taskana.WorkbasketType;
/**
@ -12,19 +13,14 @@ import pro.taskana.WorkbasketType;
public class WorkbasketResource extends ResourceSupport {
public String workbasketId;
@NotNull
public String key;
@NotNull
public String name;
@NotNull
public String domain;
@NotNull
public WorkbasketType type;
public String created; // ISO-8601
public String modified; // ISO-8601
public String description;
@ -38,6 +34,29 @@ public class WorkbasketResource extends ResourceSupport {
public String orgLevel3;
public String orgLevel4;
public WorkbasketResource() {
}
public WorkbasketResource(Workbasket workbasket) {
this.workbasketId = workbasket.getId();
this.key = workbasket.getKey();
this.name = workbasket.getName();
this.domain = workbasket.getDomain();
this.type = workbasket.getType();
this.created = workbasket.getCreated() != null ? workbasket.getCreated().toString() : null;
this.modified = workbasket.getModified() != null ? workbasket.getModified().toString() : null;
this.description = workbasket.getDescription();
this.owner = workbasket.getOwner();
this.custom1 = workbasket.getCustom1();
this.custom2 = workbasket.getCustom2();
this.custom3 = workbasket.getCustom3();
this.custom4 = workbasket.getCustom4();
this.orgLevel1 = workbasket.getOrgLevel1();
this.orgLevel2 = workbasket.getOrgLevel2();
this.orgLevel3 = workbasket.getOrgLevel3();
this.orgLevel4 = workbasket.getOrgLevel4();
}
public String getWorkbasketId() {
return workbasketId;
}

View File

@ -26,13 +26,7 @@ public class WorkbasketResourceAssembler {
private WorkbasketService workbasketService;
public WorkbasketResource toResource(Workbasket wb) throws NotAuthorizedException, WorkbasketNotFoundException {
WorkbasketResource resource = new WorkbasketResource();
BeanUtils.copyProperties(wb, resource);
// need to be set by hand, since name or type is different
resource.setWorkbasketId(wb.getId());
resource.setModified(wb.getModified().toString());
resource.setCreated(wb.getCreated().toString());
WorkbasketResource resource = new WorkbasketResource(wb);
return addLinks(resource, wb);
}

View File

@ -2,10 +2,18 @@ package pro.taskana.rest.resource;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import pro.taskana.Workbasket;
/**
* Resource class for {@link pro.taskana.Workbasket} but without links property.
*/
@JsonIgnoreProperties(value = { "links" })
@JsonIgnoreProperties(value = {"links"})
public class WorkbasketResourceWithoutLinks extends WorkbasketResource {
WorkbasketResourceWithoutLinks() {
}
WorkbasketResourceWithoutLinks(Workbasket workbasket) {
super(workbasket);
}
}

View File

@ -5,6 +5,7 @@ import javax.validation.constraints.NotNull;
import org.springframework.hateoas.ResourceSupport;
import org.springframework.hateoas.core.Relation;
import pro.taskana.WorkbasketSummary;
import pro.taskana.WorkbasketType;
/**
@ -13,32 +14,54 @@ import pro.taskana.WorkbasketType;
@Relation(collectionRelation = "workbaskets")
public class WorkbasketSummaryResource extends ResourceSupport {
public String workbasketId;
private String workbasketId;
@NotNull
public String key;
private String key;
@NotNull
public String name;
private String name;
@NotNull
public String domain;
private String domain;
@NotNull
public WorkbasketType type;
private WorkbasketType type;
public String description;
public String owner;
public String custom1;
public String custom2;
public String custom3;
public String custom4;
public String orgLevel1;
public String orgLevel2;
public String orgLevel3;
public String orgLevel4;
private String description;
private String owner;
private String custom1;
private String custom2;
private String custom3;
private String custom4;
private String orgLevel1;
private String orgLevel2;
private String orgLevel3;
private String orgLevel4;
private boolean markedForDeletion;
public WorkbasketSummaryResource() {
}
public WorkbasketSummaryResource(WorkbasketSummary workbasketSummary) {
this.workbasketId = workbasketSummary.getId();
this.key = workbasketSummary.getKey();
this.name = workbasketSummary.getName();
this.domain = workbasketSummary.getDomain();
this.type = workbasketSummary.getType();
this.description = workbasketSummary.getDescription();
this.owner = workbasketSummary.getOwner();
this.markedForDeletion = workbasketSummary.isMarkedForDeletion();
this.custom1 = workbasketSummary.getCustom1();
this.custom2 = workbasketSummary.getCustom2();
this.custom3 = workbasketSummary.getCustom3();
this.custom4 = workbasketSummary.getCustom4();
this.orgLevel1 = workbasketSummary.getOrgLevel1();
this.orgLevel2 = workbasketSummary.getOrgLevel2();
this.orgLevel3 = workbasketSummary.getOrgLevel3();
this.orgLevel4 = workbasketSummary.getOrgLevel4();
}
public String getWorkbasketId() {
return workbasketId;
}

View File

@ -1,7 +1,10 @@
package pro.taskana.rest.resource;
import java.util.List;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.hateoas.PagedResources;
import org.springframework.hateoas.mvc.ResourceAssemblerSupport;
import org.springframework.stereotype.Component;
@ -9,6 +12,7 @@ import pro.taskana.WorkbasketService;
import pro.taskana.WorkbasketSummary;
import pro.taskana.impl.WorkbasketImpl;
import pro.taskana.rest.WorkbasketController;
import pro.taskana.rest.resource.links.PageLinks;
/**
* @author HH
@ -26,11 +30,13 @@ public class WorkbasketSummaryResourceAssembler
@Override
public WorkbasketSummaryResource toResource(WorkbasketSummary workbasketSummary) {
WorkbasketSummaryResource resource = createResourceWithId(workbasketSummary.getId(), workbasketSummary);
BeanUtils.copyProperties(workbasketSummary, resource);
// named different so needs to be set by hand
resource.setWorkbasketId(workbasketSummary.getId());
return resource;
return new WorkbasketSummaryResource(workbasketSummary);
}
@PageLinks(WorkbasketController.class)
public PagedResources<WorkbasketSummaryResource> toResources(List<WorkbasketSummary> entities,
PagedResources.PageMetadata pageMetadata) {
return new PagedResources<>(toResources(entities), pageMetadata);
}
public WorkbasketSummary toModel(WorkbasketSummaryResource resource) {

View File

@ -1,54 +0,0 @@
package pro.taskana.rest.resource;
import static org.springframework.hateoas.mvc.ControllerLinkBuilder.linkTo;
import java.util.List;
import org.springframework.hateoas.Link;
import org.springframework.hateoas.PagedResources;
import org.springframework.hateoas.PagedResources.PageMetadata;
import org.springframework.web.util.UriComponentsBuilder;
import pro.taskana.WorkbasketSummary;
import pro.taskana.rest.WorkbasketController;
/**
* @author HH
*/
public class WorkbasketSummaryResourcesAssembler {
public WorkbasketSummaryResourcesAssembler() {
}
public PagedResources<WorkbasketSummaryResource> toResources(List<WorkbasketSummary> workbasketSummaries,
PageMetadata pageMetadata) {
WorkbasketSummaryResourceAssembler assembler = new WorkbasketSummaryResourceAssembler();
List<WorkbasketSummaryResource> resources = assembler.toResources(workbasketSummaries);
PagedResources<WorkbasketSummaryResource> pagedResources = new PagedResources<WorkbasketSummaryResource>(
resources,
pageMetadata);
UriComponentsBuilder original = AbstractRessourcesAssembler.getBuilderForOriginalUri();
pagedResources.add(new Link(original.toUriString()).withSelfRel());
if (pageMetadata != null) {
pagedResources.add(linkTo(WorkbasketController.class).withRel("allWorkbaskets"));
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;
}
}

View File

@ -0,0 +1,15 @@
package pro.taskana.rest.resource.links;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* Annotation to generate HATEOAS Links for paged list resources.
*/
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface PageLinks {
Class<?> value();
}

View File

@ -0,0 +1,66 @@
package pro.taskana.rest.resource.links;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.context.annotation.Configuration;
import org.springframework.hateoas.Link;
import org.springframework.hateoas.PagedResources;
import org.springframework.hateoas.ResourceSupport;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import org.springframework.web.util.UriComponentsBuilder;
import javax.servlet.http.HttpServletRequest;
import java.lang.reflect.Method;
import java.util.List;
import java.util.Map;
import static org.springframework.hateoas.mvc.ControllerLinkBuilder.linkTo;
/**
* Implementation of the PageLinks annotation to generate HATEOAS Links for paged list resources.
*/
@Configuration
@Aspect
public class PageLinksAspect {
@Around("@annotation(pro.taskana.rest.resource.links.PageLinks) && args(data, page, ..)")
public ResourceSupport addLinksToPageResource(ProceedingJoinPoint joinPoint, List<?> data, PagedResources.PageMetadata page)
throws Throwable {
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
Method method = ((MethodSignature) joinPoint.getSignature()).getMethod();
PageLinks pageLinks = method.getAnnotation(PageLinks.class);
Class<?> controller = pageLinks.value();
UriComponentsBuilder original = originalUri(controller, request);
ResourceSupport resourceSupport = (ResourceSupport) joinPoint.proceed();
resourceSupport.add(new Link(original.toUriString()).withSelfRel());
if (page != null) {
resourceSupport.add(new Link(original.replaceQueryParam("page", 1).toUriString()).withRel(Link.REL_FIRST));
resourceSupport.add(new Link(original.replaceQueryParam("page", page.getTotalPages()).toUriString())
.withRel(Link.REL_LAST));
if (page.getNumber() > 1) {
resourceSupport
.add(new Link(original.replaceQueryParam("page", page.getNumber() - 1).toUriString())
.withRel(Link.REL_PREVIOUS));
}
if (page.getNumber() < page.getTotalPages()) {
resourceSupport
.add(new Link(original.replaceQueryParam("page", page.getNumber() + 1).toUriString())
.withRel(Link.REL_NEXT));
}
}
return resourceSupport;
}
private UriComponentsBuilder originalUri(Class<?> controller, HttpServletRequest request) {
UriComponentsBuilder baseUri = linkTo(controller).toUriComponentsBuilder();
for (Map.Entry<String, String[]> entry : request.getParameterMap().entrySet()) {
for (String value : entry.getValue()) {
baseUri.queryParam(entry.getKey(), value);
}
}
return baseUri;
}
}

View File

@ -12,12 +12,6 @@ import org.springframework.test.context.web.WebAppConfiguration;
import pro.taskana.Classification;
import pro.taskana.ClassificationService;
import pro.taskana.exceptions.ClassificationAlreadyExistException;
import pro.taskana.exceptions.ClassificationNotFoundException;
import pro.taskana.exceptions.ConcurrencyException;
import pro.taskana.exceptions.DomainNotFoundException;
import pro.taskana.exceptions.InvalidArgumentException;
import pro.taskana.exceptions.NotAuthorizedException;
import pro.taskana.impl.ClassificationImpl;
import pro.taskana.rest.TestConfiguration;
@ -36,8 +30,7 @@ public class ClassificationAssemblerTest {
private ClassificationService classificationService;
@Test
public void classificationToResource() throws ClassificationNotFoundException, NotAuthorizedException,
ClassificationAlreadyExistException, ConcurrencyException, DomainNotFoundException, InvalidArgumentException {
public void classificationToResource() {
// given
ClassificationImpl classification = (ClassificationImpl) classificationService.newClassification("DOMAIN_A",
"1", "A");
@ -68,34 +61,37 @@ public class ClassificationAssemblerTest {
@Test
public void resourceToClassification() {
ClassificationImpl classification = (ClassificationImpl) classificationService.newClassification("12",
"DOMAIN_B", "AB");
// given
ClassificationResource classificationResource = new ClassificationResource();
classificationResource.setClassificationId("1");
classificationResource.setKey("12");
classificationResource.setName("TestB");
classificationResource.setType("AB");
classificationResource.setDomain("DOMAIN_B");
classificationResource.setApplicationEntryPoint("Test");
classificationResource.setCategory("ABC");
classificationResource.setCreated("2010-01-01T12:00:00Z");
classificationResource.setModified("2011-11-11T11:00:00Z");
classificationResource.setCustom1("Custom");
classificationResource.setCustom2("Custom2");
classificationResource.setCustom1("Custom1");
classificationResource.setCustom3("Custom3");
classificationResource.setCustom4("Custom4");
classificationResource.setCustom5("Custom5");
classificationResource.setCustom6("Custom6");
classificationResource.setCustom7("Custom7");
classificationResource.setCustom8("Custom8");
classificationResource.setParentId("2");
classificationResource.setPriority(2);
classificationResource.setApplicationEntryPoint("12");
classificationResource.setServiceLevel("P1D");
classificationResource.setDescription("Test");
classificationResource.setIsValidInDomain(true);
classification.setId("1");
classification.setType("AB");
classification.setDomain("DOMAIN_B");
classification.setApplicationEntryPoint("Test");
classification.setCategory("ABC");
classification.setCreated(Instant.parse("2010-01-01T12:00:00Z"));
classification.setModified(Instant.parse("2011-11-11T11:00:00Z"));
classification.setCustom1("Custom");
classification.setCustom2("Custom2");
classification.setCustom1("Custom1");
classification.setCustom3("Custom3");
classification.setCustom4("Custom4");
classification.setCustom5("Custom5");
classification.setCustom6("Custom6");
classification.setCustom7("Custom7");
classification.setCustom8("Custom8");
classification.setParentId("2");
classification.setPriority(2);
classification.setApplicationEntryPoint("12");
classification.setServiceLevel("P1D");
classification.setDescription("Test");
classification.setIsValidInDomain(true);
ClassificationResource classificationResource = new ClassificationResource(classification);
// when
ClassificationImpl classification = (ClassificationImpl) classificationResourceAssembler
classification = (ClassificationImpl) classificationResourceAssembler
.toModel(classificationResource);
// then
testEquality(classification, classificationResource);

View File

@ -29,7 +29,7 @@ import pro.taskana.report.WorkbasketReport;
import pro.taskana.rest.TestConfiguration;
/**
* Test for {@link ReportAssembler}.
* Test for {@link ReportResourceAssembler}.
*/
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = {TestConfiguration.class})
@ -37,7 +37,7 @@ import pro.taskana.rest.TestConfiguration;
public class ReportResourceTest {
@Autowired
private ReportAssembler reportAssembler;
private ReportResourceAssembler reportResourceAssembler;
private int daysDiff;
private LocalDateTime now;
@ -58,7 +58,7 @@ public class ReportResourceTest {
// given
WorkbasketReport report = new WorkbasketReport(headers);
// when
ReportResource resource = reportAssembler.toReportResource(report, now.toInstant(ZoneOffset.UTC));
ReportResource resource = reportResourceAssembler.toReportResource(report, now.toInstant(ZoneOffset.UTC));
// then
// meta
@ -92,7 +92,7 @@ public class ReportResourceTest {
item.setKey("key");
report.addItem(item);
// when
ReportResource resource = reportAssembler.toReportResource(report, now.toInstant(ZoneOffset.UTC));
ReportResource resource = reportResourceAssembler.toReportResource(report, now.toInstant(ZoneOffset.UTC));
// then
// meta
@ -137,7 +137,7 @@ public class ReportResourceTest {
item.setKey("key2");
report.addItem(item);
// when
ReportResource resource = reportAssembler.toReportResource(report, now.toInstant(ZoneOffset.UTC));
ReportResource resource = reportResourceAssembler.toReportResource(report, now.toInstant(ZoneOffset.UTC));
// then
// meta
@ -190,7 +190,7 @@ public class ReportResourceTest {
item.setAttachmentKey(null);
report.addItem(item);
// when
ReportResource resource = reportAssembler.toReportResource(report, now.toInstant(ZoneOffset.UTC));
ReportResource resource = reportResourceAssembler.toReportResource(report, now.toInstant(ZoneOffset.UTC));
// then
// meta
@ -268,7 +268,7 @@ public class ReportResourceTest {
item.setKey("key2");
report.addItem(item);
// when
ReportResource resource = reportAssembler.toReportResource(report, now.toInstant(ZoneOffset.UTC));
ReportResource resource = reportResourceAssembler.toReportResource(report, now.toInstant(ZoneOffset.UTC));
// then
// meta

View File

@ -16,15 +16,15 @@ import pro.taskana.impl.WorkbasketAccessItemImpl;
import pro.taskana.rest.TestConfiguration;
/**
* Test for {@link WorkbasketAccessItemAssembler}.
* Test for {@link WorkbasketAccessItemResourceAssembler}.
*/
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = {TestConfiguration.class})
@WebAppConfiguration
public class WorkbasketAccessItemAssemblerTest {
public class WorkbasketAccessItemResourceAssemblerTest {
@Autowired
WorkbasketAccessItemAssembler workbasketAccessItemAssembler;
WorkbasketAccessItemResourceAssembler workbasketAccessItemResourceAssembler;
@Autowired
WorkbasketService workbasketService;
@ -52,7 +52,7 @@ public class WorkbasketAccessItemAssemblerTest {
accessItem.setPermCustom11(true);
accessItem.setPermCustom12(true);
// when
WorkbasketAccessItemResource resource = workbasketAccessItemAssembler.toResource(
WorkbasketAccessItemResource resource = workbasketAccessItemResourceAssembler.toResource(
accessItem);
// then
testEquality(accessItem, resource);
@ -84,7 +84,7 @@ public class WorkbasketAccessItemAssemblerTest {
resource.setPermCustom11(true);
resource.setPermCustom12(false);
// when
WorkbasketAccessItem accessItem = workbasketAccessItemAssembler.toModel(resource);
WorkbasketAccessItem accessItem = workbasketAccessItemResourceAssembler.toModel(resource);
// then
testEquality(accessItem, resource);
}

View File

@ -47,20 +47,20 @@ public class WorkbasketSummaryAssemblerTest {
// when
WorkbasketSummaryResource workbasketSummaryResource = workbasketSummaryAssembler.toResource(workbasketSummary);
// then
Assert.assertEquals(workbasketSummary.getDescription(), workbasketSummaryResource.description);
Assert.assertEquals(workbasketSummary.getDomain(), workbasketSummaryResource.domain);
Assert.assertEquals(workbasketSummary.getId(), workbasketSummaryResource.workbasketId);
Assert.assertEquals(workbasketSummary.getKey(), workbasketSummaryResource.key);
Assert.assertEquals(workbasketSummary.getName(), workbasketSummaryResource.name);
Assert.assertEquals(workbasketSummary.getCustom1(), workbasketSummaryResource.custom1);
Assert.assertEquals(workbasketSummary.getCustom2(), workbasketSummaryResource.custom2);
Assert.assertEquals(workbasketSummary.getCustom3(), workbasketSummaryResource.custom3);
Assert.assertEquals(workbasketSummary.getCustom4(), workbasketSummaryResource.custom4);
Assert.assertEquals(workbasketSummary.getOrgLevel1(), workbasketSummaryResource.orgLevel1);
Assert.assertEquals(workbasketSummary.getOrgLevel2(), workbasketSummaryResource.orgLevel2);
Assert.assertEquals(workbasketSummary.getOrgLevel3(), workbasketSummaryResource.orgLevel3);
Assert.assertEquals(workbasketSummary.getOrgLevel4(), workbasketSummaryResource.orgLevel4);
Assert.assertEquals(workbasketSummary.getOwner(), workbasketSummaryResource.owner);
Assert.assertEquals(workbasketSummary.getType(), workbasketSummaryResource.type);
Assert.assertEquals(workbasketSummary.getDescription(), workbasketSummaryResource.getDescription());
Assert.assertEquals(workbasketSummary.getDomain(), workbasketSummaryResource.getDomain());
Assert.assertEquals(workbasketSummary.getId(), workbasketSummaryResource.getWorkbasketId());
Assert.assertEquals(workbasketSummary.getKey(), workbasketSummaryResource.getKey());
Assert.assertEquals(workbasketSummary.getName(), workbasketSummaryResource.getName());
Assert.assertEquals(workbasketSummary.getCustom1(), workbasketSummaryResource.getCustom1());
Assert.assertEquals(workbasketSummary.getCustom2(), workbasketSummaryResource.getCustom2());
Assert.assertEquals(workbasketSummary.getCustom3(), workbasketSummaryResource.getCustom3());
Assert.assertEquals(workbasketSummary.getCustom4(), workbasketSummaryResource.getCustom4());
Assert.assertEquals(workbasketSummary.getOrgLevel1(), workbasketSummaryResource.getOrgLevel1());
Assert.assertEquals(workbasketSummary.getOrgLevel2(), workbasketSummaryResource.getOrgLevel2());
Assert.assertEquals(workbasketSummary.getOrgLevel3(), workbasketSummaryResource.getOrgLevel3());
Assert.assertEquals(workbasketSummary.getOrgLevel4(), workbasketSummaryResource.getOrgLevel4());
Assert.assertEquals(workbasketSummary.getOwner(), workbasketSummaryResource.getOwner());
Assert.assertEquals(workbasketSummary.getType(), workbasketSummaryResource.getType());
}
}