TSK-307: fixed bug and consolidated code structure.

This commit is contained in:
Holger Hagen 2018-02-18 22:28:22 +01:00 committed by Marcel Lengl
parent cf7d795e3c
commit 0e393f35f6
6 changed files with 150 additions and 231 deletions

View File

@ -4,7 +4,6 @@ import java.sql.SQLException;
import javax.annotation.PostConstruct;
import org.modelmapper.ModelMapper;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.config.ConfigurableBeanFactory;
@ -22,11 +21,10 @@ import pro.taskana.ClassificationService;
import pro.taskana.TaskMonitorService;
import pro.taskana.TaskService;
import pro.taskana.TaskanaEngine;
import pro.taskana.Workbasket;
import pro.taskana.WorkbasketService;
import pro.taskana.configuration.TaskanaEngineConfiguration;
import pro.taskana.rest.resource.mapper.WorkbasketDefinitionMapper;
import pro.taskana.rest.serialization.WorkbasketMixIn;
import pro.taskana.rest.resource.mapper.WorkbasketSummaryMapper;
import pro.taskana.sampledata.SampleDataGenerator;
@SpringBootApplication
@ -58,6 +56,16 @@ public class RestApplication {
return getTaskanaEngine().getWorkbasketService();
}
@Bean
public WorkbasketSummaryMapper getWorkbasketSummaryMapper() {
return new WorkbasketSummaryMapper();
}
@Bean
public WorkbasketDefinitionMapper getWorkbasketDefinitionMapper() {
return new WorkbasketDefinitionMapper();
}
@Bean
@Scope(ConfigurableBeanFactory.SCOPE_SINGLETON)
public TaskanaEngine getTaskanaEngine() throws SQLException {
@ -71,15 +79,6 @@ public class RestApplication {
return taskanaEngineConfiguration;
}
@PostConstruct
public void createSampleData() {
try {
new SampleDataGenerator(getTaskanaEngineConfiguration().createDefaultDataSource()).generateSampleData();
} catch (SQLException e) {
logger.error("Could not create sample data.", e);
}
}
/**
* Needed to override JSON De-/Serializer in Jackson.
*
@ -89,7 +88,7 @@ public class RestApplication {
@Bean
public Jackson2ObjectMapperBuilder jacksonBuilder(HandlerInstantiator handlerInstantiator) {
Jackson2ObjectMapperBuilder b = new Jackson2ObjectMapperBuilder();
b.indentOutput(true).mixIn(Workbasket.class, WorkbasketMixIn.class);
b.indentOutput(true);
b.handlerInstantiator(handlerInstantiator);
return b;
}
@ -105,13 +104,13 @@ public class RestApplication {
return new SpringHandlerInstantiator(context.getAutowireCapableBeanFactory());
}
@Bean
public ModelMapper modelMapper() {
return new ModelMapper();
@PostConstruct
public void createSampleData() {
try {
new SampleDataGenerator(getTaskanaEngineConfiguration().createDefaultDataSource()).generateSampleData();
} catch (SQLException e) {
logger.error("Could not create sample data.", e);
}
}
@Bean
public WorkbasketDefinitionMapper getWorkbasketDefinitionMapper() {
return new WorkbasketDefinitionMapper();
}
}

View File

@ -1,13 +1,10 @@
package pro.taskana.rest;
import static org.springframework.hateoas.mvc.ControllerLinkBuilder.linkTo;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.hateoas.Link;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
@ -31,9 +28,8 @@ import pro.taskana.exceptions.NotAuthorizedException;
import pro.taskana.exceptions.WorkbasketNotFoundException;
import pro.taskana.impl.WorkbasketAuthorization;
import pro.taskana.impl.WorkbasketType;
import pro.taskana.rest.dto.WorkbasketSummaryDto;
import pro.taskana.rest.mapper.WorkbasketSummaryMapper;
import pro.taskana.security.CurrentUserContext;
import pro.taskana.rest.resource.WorkbasketSummaryResource;
import pro.taskana.rest.resource.mapper.WorkbasketSummaryMapper;
@RestController
@RequestMapping(path = "/v1/workbaskets", produces = {MediaType.APPLICATION_JSON_VALUE})
@ -49,47 +45,45 @@ public class WorkbasketController {
@Autowired
private WorkbasketService workbasketService;
@Autowired
private WorkbasketSummaryMapper workbasketSummaryMapper;
@RequestMapping(method = RequestMethod.GET)
public ResponseEntity<List<WorkbasketSummaryDto>> GetWorkbaskets(
public ResponseEntity<List<WorkbasketSummaryResource>> getWorkbaskets(
@RequestParam(value = "sortBy", defaultValue = "name", required = false) String sortBy,
@RequestParam(value = "order", defaultValue = "asc", required = false) String order,
@RequestParam(value = "name", defaultValue = "", required = false) String name,
@RequestParam(value = "nameLike", defaultValue = "", required = false) String nameLike,
@RequestParam(value = "descLike", defaultValue = "", required = false) String descLike,
@RequestParam(value = "owner", defaultValue = "", required = false) String owner,
@RequestParam(value = "ownerLike", defaultValue = "", required = false) String ownerLike,
@RequestParam(value = "type", defaultValue = "", required = false) String type,
@RequestParam(value = "requiredPermission", defaultValue = "", required = false) String requiredPermission) {
@RequestParam(value = "name", required = false) String name,
@RequestParam(value = "nameLike", required = false) String nameLike,
@RequestParam(value = "descLike", required = false) String descLike,
@RequestParam(value = "owner", required = false) String owner,
@RequestParam(value = "ownerLike", required = false) String ownerLike,
@RequestParam(value = "type", required = false) String type,
@RequestParam(value = "requiredPermission", required = false) String requiredPermission) {
List<WorkbasketSummary> workbasketsSummary;
WorkbasketQuery query = workbasketService.createWorkbasketQuery();
try {
AddSortByQuery(query, sortBy, order);
AddFilterQuery(query, name, nameLike, descLike, owner, ownerLike, type);
AddAuthorization(query, requiredPermission);
addSortingToQuery(query, sortBy, order);
addAttributeFilter(query, name, nameLike, descLike, owner, ownerLike, type);
addAuthorizationFilter(query, requiredPermission);
workbasketsSummary = query.list();
} catch (InvalidArgumentException e) {
return new ResponseEntity<>(HttpStatus.CONFLICT);
} catch (InvalidRequestException e) {
return new ResponseEntity<>(HttpStatus.CONFLICT);
} catch (NotAuthorizedException e) {
return new ResponseEntity<>(HttpStatus.UNAUTHORIZED);
}
return new ResponseEntity<>(workbasketsSummary.stream()
.map(workbasket -> workbasketSummaryMapper.convertToDto(workbasket))
.map(WorkbasketController::WorkbasketSummaryLink)
.map(workbasket -> workbasketSummaryMapper.toResource(workbasket))
.collect(Collectors.toList()), HttpStatus.OK);
}
@RequestMapping(value = "/{workbasketid}")
public ResponseEntity<Workbasket> getWorkbasketById(@PathVariable(value = "workbasketid") String workbasketId) {
public ResponseEntity<Workbasket> getWorkbasket(@PathVariable(value = "workbasketid") String workbasketId) {
try {
Workbasket workbasket = workbasketService.getWorkbasket(workbasketId);
return new ResponseEntity<>(workbasket, HttpStatus.OK);
@ -149,68 +143,68 @@ public class WorkbasketController {
return ResponseEntity.status(HttpStatus.NO_CONTENT).build();
}
private void AddAuthorization(WorkbasketQuery query, String requiredPermission) throws InvalidArgumentException {
if (requiredPermission.isEmpty()) {
private void addAuthorizationFilter(WorkbasketQuery query, String requiredPermission)
throws InvalidArgumentException {
if (requiredPermission == null) {
return;
}
String[] accessIds = GetCurrentUserAccessIds();
for (String authorization : Arrays.asList(requiredPermission.split(","))) {
try {
switch (authorization.trim()) {
case "READ":
query.accessIdsHavePermission(WorkbasketAuthorization.READ, accessIds);
query.callerHasPermission(WorkbasketAuthorization.READ);
break;
case "OPEN":
query.accessIdsHavePermission(WorkbasketAuthorization.OPEN, accessIds);
query.callerHasPermission(WorkbasketAuthorization.OPEN);
break;
case "APPEND":
query.accessIdsHavePermission(WorkbasketAuthorization.APPEND, accessIds);
query.callerHasPermission(WorkbasketAuthorization.APPEND);
break;
case "TRANSFER":
query.accessIdsHavePermission(WorkbasketAuthorization.TRANSFER, accessIds);
query.callerHasPermission(WorkbasketAuthorization.TRANSFER);
break;
case "DISTRIBUTE":
query.accessIdsHavePermission(WorkbasketAuthorization.DISTRIBUTE, accessIds);
query.callerHasPermission(WorkbasketAuthorization.DISTRIBUTE);
break;
case "DELETE":
query.accessIdsHavePermission(WorkbasketAuthorization.DELETE, accessIds);
query.callerHasPermission(WorkbasketAuthorization.DELETE);
break;
case "CUSTOM_1":
query.accessIdsHavePermission(WorkbasketAuthorization.CUSTOM_1, accessIds);
query.callerHasPermission(WorkbasketAuthorization.CUSTOM_1);
break;
case "CUSTOM_2":
query.accessIdsHavePermission(WorkbasketAuthorization.CUSTOM_2, accessIds);
query.callerHasPermission(WorkbasketAuthorization.CUSTOM_2);
break;
case "CUSTOM_3":
query.accessIdsHavePermission(WorkbasketAuthorization.CUSTOM_3, accessIds);
query.callerHasPermission(WorkbasketAuthorization.CUSTOM_3);
break;
case "CUSTOM_4":
query.accessIdsHavePermission(WorkbasketAuthorization.CUSTOM_4, accessIds);
query.callerHasPermission(WorkbasketAuthorization.CUSTOM_4);
break;
case "CUSTOM_5":
query.accessIdsHavePermission(WorkbasketAuthorization.CUSTOM_5, accessIds);
query.callerHasPermission(WorkbasketAuthorization.CUSTOM_5);
break;
case "CUSTOM_6":
query.accessIdsHavePermission(WorkbasketAuthorization.CUSTOM_6, accessIds);
query.callerHasPermission(WorkbasketAuthorization.CUSTOM_6);
break;
case "CUSTOM_7":
query.accessIdsHavePermission(WorkbasketAuthorization.CUSTOM_7, accessIds);
query.callerHasPermission(WorkbasketAuthorization.CUSTOM_7);
break;
case "CUSTOM_8":
query.accessIdsHavePermission(WorkbasketAuthorization.CUSTOM_8, accessIds);
query.callerHasPermission(WorkbasketAuthorization.CUSTOM_8);
break;
case "CUSTOM_9":
query.accessIdsHavePermission(WorkbasketAuthorization.CUSTOM_9, accessIds);
query.callerHasPermission(WorkbasketAuthorization.CUSTOM_9);
break;
case "CUSTOM_10":
query.accessIdsHavePermission(WorkbasketAuthorization.CUSTOM_10, accessIds);
query.callerHasPermission(WorkbasketAuthorization.CUSTOM_10);
break;
case "CUSTOM_11":
query.accessIdsHavePermission(WorkbasketAuthorization.CUSTOM_11, accessIds);
query.callerHasPermission(WorkbasketAuthorization.CUSTOM_11);
break;
case "CUSTOM_12":
query.accessIdsHavePermission(WorkbasketAuthorization.CUSTOM_12, accessIds);
query.callerHasPermission(WorkbasketAuthorization.CUSTOM_12);
break;
}
} catch (InvalidArgumentException e) {
@ -219,12 +213,12 @@ public class WorkbasketController {
}
}
private void AddSortByQuery(WorkbasketQuery query, String sortBy, String order)
private void addSortingToQuery(WorkbasketQuery query, String sortBy, String order)
throws InvalidRequestException, InvalidArgumentException {
BaseQuery.SortDirection sortDirection = GetSortDirecction(order);
BaseQuery.SortDirection sortDirection = getSortDirection(order);
if (sortBy.equals(NAME)) {
query.orderByKey(sortDirection);
query.orderByName(sortDirection);
} else if (sortBy.equals(KEY)) {
query.orderByKey(sortDirection);
} else if (sortBy.equals(DESCRIPTION)) {
@ -236,56 +230,39 @@ public class WorkbasketController {
}
}
private BaseQuery.SortDirection GetSortDirecction(String order) throws InvalidRequestException {
private BaseQuery.SortDirection getSortDirection(String order) throws InvalidRequestException {
if (order.equals(DESC)) {
return BaseQuery.SortDirection.DESCENDING;
}
return BaseQuery.SortDirection.ASCENDING;
}
private void AddFilterQuery(WorkbasketQuery query,
private void addAttributeFilter(WorkbasketQuery query,
String name, String nameLike,
String descLike, String owner,
String ownerLike, String type) throws NotAuthorizedException, InvalidArgumentException {
if (!name.isEmpty())
String ownerLike, String type) throws InvalidArgumentException {
if (name != null)
query.nameIn(name);
if (!nameLike.isEmpty())
if (nameLike != null)
query.nameLike(LIKE + nameLike + LIKE);
if (!owner.isEmpty())
if (owner != null)
query.ownerIn(owner);
if (!ownerLike.isEmpty())
if (ownerLike != null)
query.ownerLike(LIKE + ownerLike + LIKE);
if (!descLike.isEmpty())
if (descLike != null)
query.descriptionLike(LIKE + descLike + LIKE);
switch (type) {
case "PERSONAL":
query.typeIn(WorkbasketType.PERSONAL);
case "GROUP":
query.typeIn(WorkbasketType.GROUP);
case "CLEARANCE":
query.typeIn(WorkbasketType.CLEARANCE);
case "TOPIC":
query.typeIn(WorkbasketType.TOPIC);
if (type != null) {
switch (type) {
case "PERSONAL":
query.typeIn(WorkbasketType.PERSONAL);
case "GROUP":
query.typeIn(WorkbasketType.GROUP);
case "CLEARANCE":
query.typeIn(WorkbasketType.CLEARANCE);
case "TOPIC":
query.typeIn(WorkbasketType.TOPIC);
}
}
}
private String[] GetCurrentUserAccessIds() throws InvalidArgumentException {
String[] accessIds;
List<String> ucAccessIds = CurrentUserContext.getAccessIds();
if (ucAccessIds != null && !ucAccessIds.isEmpty()) {
accessIds = new String[ucAccessIds.size()];
accessIds = ucAccessIds.toArray(accessIds);
} else {
throw new InvalidArgumentException("CurrentUserContext need to have at least one accessId.");
}
return accessIds;
}
private static WorkbasketSummaryDto WorkbasketSummaryLink(WorkbasketSummaryDto workbasketSummaryDto) {
Link selfLink = linkTo(WorkbasketController.class).slash(workbasketSummaryDto.getWorkbasketId()).withSelfRel();
workbasketSummaryDto.add(selfLink);
return workbasketSummaryDto;
}
}

View File

@ -1,108 +0,0 @@
package pro.taskana.rest.dto;
import org.springframework.hateoas.ResourceSupport;
import pro.taskana.impl.WorkbasketType;
public class WorkbasketSummaryDto extends ResourceSupport {
private String workbasketId;
private String key;
private String name;
private String description;
private String owner;
private String domain;
private WorkbasketType type;
private String orgLevel1;
private String orgLevel2;
private String orgLevel3;
private String orgLevel4;
public String getWorkbasketId() {
return workbasketId;
}
public void setWorkbasketId(String workbasketId) {
this.workbasketId = workbasketId;
}
public String getKey() {
return key;
}
public void setKey(String key) {
this.key = key;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public String getOwner() {
return owner;
}
public void setOwner(String owner) {
this.owner = owner;
}
public String getDomain() {
return domain;
}
public void setDomain(String domain) {
this.domain = domain;
}
public WorkbasketType getType() {
return type;
}
public void setType(WorkbasketType type) {
this.type = type;
}
public String getOrgLevel1() {
return orgLevel1;
}
public void setOrgLevel1(String orgLevel1) {
this.orgLevel1 = orgLevel1;
}
public String getOrgLevel2() {
return orgLevel2;
}
public void setOrgLevel2(String orgLevel2) {
this.orgLevel2 = orgLevel2;
}
public String getOrgLevel3() {
return orgLevel3;
}
public void setOrgLevel3(String orgLevel3) {
this.orgLevel3 = orgLevel3;
}
public String getOrgLevel4() {
return orgLevel4;
}
public void setOrgLevel4(String orgLevel4) {
this.orgLevel4 = orgLevel4;
}
}

View File

@ -1,21 +0,0 @@
package pro.taskana.rest.mapper;
import org.modelmapper.ModelMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.hateoas.ResourceSupport;
import org.springframework.stereotype.Component;
import pro.taskana.WorkbasketSummary;
import pro.taskana.rest.dto.WorkbasketSummaryDto;
@Component
public class WorkbasketSummaryMapper extends ResourceSupport {
@Autowired
private ModelMapper modelMapper;
public WorkbasketSummaryDto convertToDto(WorkbasketSummary workbasketSummary){
WorkbasketSummaryDto dto = modelMapper.map(workbasketSummary, WorkbasketSummaryDto.class);
dto.setWorkbasketId(workbasketSummary.getId());
return dto;
}
}

View File

@ -0,0 +1,48 @@
package pro.taskana.rest.resource;
import javax.validation.constraints.NotNull;
import org.springframework.hateoas.ResourceSupport;
import pro.taskana.impl.WorkbasketType;
public class WorkbasketSummaryResource extends ResourceSupport {
public String id;
@NotNull
public String key;
@NotNull
public String name;
@NotNull
public String domain;
@NotNull
public WorkbasketType type;
public String description;
public String owner;
public String orgLevel1;
public String orgLevel2;
public String orgLevel3;
public String orgLevel4;
public WorkbasketSummaryResource(String id, String key, String name, String description, String owner,
String domain, WorkbasketType type, String orgLevel1, String orgLevel2, String orgLevel3, String orgLevel4) {
super();
this.id = id;
this.key = key;
this.name = name;
this.description = description;
this.owner = owner;
this.domain = domain;
this.type = type;
this.orgLevel1 = orgLevel1;
this.orgLevel2 = orgLevel2;
this.orgLevel3 = orgLevel3;
this.orgLevel4 = orgLevel4;
}
}

View File

@ -0,0 +1,24 @@
package pro.taskana.rest.resource.mapper;
import static org.springframework.hateoas.mvc.ControllerLinkBuilder.linkTo;
import static org.springframework.hateoas.mvc.ControllerLinkBuilder.methodOn;
import pro.taskana.WorkbasketSummary;
import pro.taskana.rest.WorkbasketController;
import pro.taskana.rest.resource.WorkbasketSummaryResource;
public class WorkbasketSummaryMapper {
public WorkbasketSummaryResource toResource(WorkbasketSummary summary) {
WorkbasketSummaryResource resource = new WorkbasketSummaryResource(
summary.getId(), summary.getKey(), summary.getName(), summary.getDescription(), summary.getOwner(),
summary.getDomain(), summary.getType(), summary.getOrgLevel1(), summary.getOrgLevel2(),
summary.getOrgLevel3(), summary.getOrgLevel4());
// Add self reference
resource.add(linkTo(methodOn(WorkbasketController.class).getWorkbasket(summary.getId())).withSelfRel());
return resource;
}
}