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 javax.annotation.PostConstruct;
import org.modelmapper.ModelMapper;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.config.ConfigurableBeanFactory; import org.springframework.beans.factory.config.ConfigurableBeanFactory;
@ -22,11 +21,10 @@ import pro.taskana.ClassificationService;
import pro.taskana.TaskMonitorService; import pro.taskana.TaskMonitorService;
import pro.taskana.TaskService; import pro.taskana.TaskService;
import pro.taskana.TaskanaEngine; import pro.taskana.TaskanaEngine;
import pro.taskana.Workbasket;
import pro.taskana.WorkbasketService; import pro.taskana.WorkbasketService;
import pro.taskana.configuration.TaskanaEngineConfiguration; import pro.taskana.configuration.TaskanaEngineConfiguration;
import pro.taskana.rest.resource.mapper.WorkbasketDefinitionMapper; 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; import pro.taskana.sampledata.SampleDataGenerator;
@SpringBootApplication @SpringBootApplication
@ -58,6 +56,16 @@ public class RestApplication {
return getTaskanaEngine().getWorkbasketService(); return getTaskanaEngine().getWorkbasketService();
} }
@Bean
public WorkbasketSummaryMapper getWorkbasketSummaryMapper() {
return new WorkbasketSummaryMapper();
}
@Bean
public WorkbasketDefinitionMapper getWorkbasketDefinitionMapper() {
return new WorkbasketDefinitionMapper();
}
@Bean @Bean
@Scope(ConfigurableBeanFactory.SCOPE_SINGLETON) @Scope(ConfigurableBeanFactory.SCOPE_SINGLETON)
public TaskanaEngine getTaskanaEngine() throws SQLException { public TaskanaEngine getTaskanaEngine() throws SQLException {
@ -71,15 +79,6 @@ public class RestApplication {
return taskanaEngineConfiguration; 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. * Needed to override JSON De-/Serializer in Jackson.
* *
@ -89,7 +88,7 @@ public class RestApplication {
@Bean @Bean
public Jackson2ObjectMapperBuilder jacksonBuilder(HandlerInstantiator handlerInstantiator) { public Jackson2ObjectMapperBuilder jacksonBuilder(HandlerInstantiator handlerInstantiator) {
Jackson2ObjectMapperBuilder b = new Jackson2ObjectMapperBuilder(); Jackson2ObjectMapperBuilder b = new Jackson2ObjectMapperBuilder();
b.indentOutput(true).mixIn(Workbasket.class, WorkbasketMixIn.class); b.indentOutput(true);
b.handlerInstantiator(handlerInstantiator); b.handlerInstantiator(handlerInstantiator);
return b; return b;
} }
@ -105,13 +104,13 @@ public class RestApplication {
return new SpringHandlerInstantiator(context.getAutowireCapableBeanFactory()); return new SpringHandlerInstantiator(context.getAutowireCapableBeanFactory());
} }
@Bean @PostConstruct
public ModelMapper modelMapper() { public void createSampleData() {
return new ModelMapper(); 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; package pro.taskana.rest;
import static org.springframework.hateoas.mvc.ControllerLinkBuilder.linkTo;
import java.util.Arrays; import java.util.Arrays;
import java.util.List; import java.util.List;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.hateoas.Link;
import org.springframework.http.HttpStatus; import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType; import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity; import org.springframework.http.ResponseEntity;
@ -31,9 +28,8 @@ import pro.taskana.exceptions.NotAuthorizedException;
import pro.taskana.exceptions.WorkbasketNotFoundException; import pro.taskana.exceptions.WorkbasketNotFoundException;
import pro.taskana.impl.WorkbasketAuthorization; import pro.taskana.impl.WorkbasketAuthorization;
import pro.taskana.impl.WorkbasketType; import pro.taskana.impl.WorkbasketType;
import pro.taskana.rest.dto.WorkbasketSummaryDto; import pro.taskana.rest.resource.WorkbasketSummaryResource;
import pro.taskana.rest.mapper.WorkbasketSummaryMapper; import pro.taskana.rest.resource.mapper.WorkbasketSummaryMapper;
import pro.taskana.security.CurrentUserContext;
@RestController @RestController
@RequestMapping(path = "/v1/workbaskets", produces = {MediaType.APPLICATION_JSON_VALUE}) @RequestMapping(path = "/v1/workbaskets", produces = {MediaType.APPLICATION_JSON_VALUE})
@ -49,47 +45,45 @@ public class WorkbasketController {
@Autowired @Autowired
private WorkbasketService workbasketService; private WorkbasketService workbasketService;
@Autowired @Autowired
private WorkbasketSummaryMapper workbasketSummaryMapper; private WorkbasketSummaryMapper workbasketSummaryMapper;
@RequestMapping(method = RequestMethod.GET) @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 = "sortBy", defaultValue = "name", required = false) String sortBy,
@RequestParam(value = "order", defaultValue = "asc", required = false) String order, @RequestParam(value = "order", defaultValue = "asc", required = false) String order,
@RequestParam(value = "name", defaultValue = "", required = false) String name, @RequestParam(value = "name", required = false) String name,
@RequestParam(value = "nameLike", defaultValue = "", required = false) String nameLike, @RequestParam(value = "nameLike", required = false) String nameLike,
@RequestParam(value = "descLike", defaultValue = "", required = false) String descLike, @RequestParam(value = "descLike", required = false) String descLike,
@RequestParam(value = "owner", defaultValue = "", required = false) String owner, @RequestParam(value = "owner", required = false) String owner,
@RequestParam(value = "ownerLike", defaultValue = "", required = false) String ownerLike, @RequestParam(value = "ownerLike", required = false) String ownerLike,
@RequestParam(value = "type", defaultValue = "", required = false) String type, @RequestParam(value = "type", required = false) String type,
@RequestParam(value = "requiredPermission", defaultValue = "", required = false) String requiredPermission) { @RequestParam(value = "requiredPermission", required = false) String requiredPermission) {
List<WorkbasketSummary> workbasketsSummary; List<WorkbasketSummary> workbasketsSummary;
WorkbasketQuery query = workbasketService.createWorkbasketQuery(); WorkbasketQuery query = workbasketService.createWorkbasketQuery();
try { try {
AddSortByQuery(query, sortBy, order); addSortingToQuery(query, sortBy, order);
AddFilterQuery(query, name, nameLike, descLike, owner, ownerLike, type); addAttributeFilter(query, name, nameLike, descLike, owner, ownerLike, type);
AddAuthorization(query, requiredPermission); addAuthorizationFilter(query, requiredPermission);
workbasketsSummary = query.list(); workbasketsSummary = query.list();
} catch (InvalidArgumentException e) { } catch (InvalidArgumentException e) {
return new ResponseEntity<>(HttpStatus.CONFLICT); return new ResponseEntity<>(HttpStatus.CONFLICT);
} catch (InvalidRequestException e) { } catch (InvalidRequestException e) {
return new ResponseEntity<>(HttpStatus.CONFLICT); return new ResponseEntity<>(HttpStatus.CONFLICT);
} catch (NotAuthorizedException e) {
return new ResponseEntity<>(HttpStatus.UNAUTHORIZED);
} }
return new ResponseEntity<>(workbasketsSummary.stream() return new ResponseEntity<>(workbasketsSummary.stream()
.map(workbasket -> workbasketSummaryMapper.convertToDto(workbasket)) .map(workbasket -> workbasketSummaryMapper.toResource(workbasket))
.map(WorkbasketController::WorkbasketSummaryLink)
.collect(Collectors.toList()), HttpStatus.OK); .collect(Collectors.toList()), HttpStatus.OK);
} }
@RequestMapping(value = "/{workbasketid}") @RequestMapping(value = "/{workbasketid}")
public ResponseEntity<Workbasket> getWorkbasketById(@PathVariable(value = "workbasketid") String workbasketId) { public ResponseEntity<Workbasket> getWorkbasket(@PathVariable(value = "workbasketid") String workbasketId) {
try { try {
Workbasket workbasket = workbasketService.getWorkbasket(workbasketId); Workbasket workbasket = workbasketService.getWorkbasket(workbasketId);
return new ResponseEntity<>(workbasket, HttpStatus.OK); return new ResponseEntity<>(workbasket, HttpStatus.OK);
@ -149,68 +143,68 @@ public class WorkbasketController {
return ResponseEntity.status(HttpStatus.NO_CONTENT).build(); return ResponseEntity.status(HttpStatus.NO_CONTENT).build();
} }
private void AddAuthorization(WorkbasketQuery query, String requiredPermission) throws InvalidArgumentException { private void addAuthorizationFilter(WorkbasketQuery query, String requiredPermission)
if (requiredPermission.isEmpty()) { throws InvalidArgumentException {
if (requiredPermission == null) {
return; return;
} }
String[] accessIds = GetCurrentUserAccessIds();
for (String authorization : Arrays.asList(requiredPermission.split(","))) { for (String authorization : Arrays.asList(requiredPermission.split(","))) {
try { try {
switch (authorization.trim()) { switch (authorization.trim()) {
case "READ": case "READ":
query.accessIdsHavePermission(WorkbasketAuthorization.READ, accessIds); query.callerHasPermission(WorkbasketAuthorization.READ);
break; break;
case "OPEN": case "OPEN":
query.accessIdsHavePermission(WorkbasketAuthorization.OPEN, accessIds); query.callerHasPermission(WorkbasketAuthorization.OPEN);
break; break;
case "APPEND": case "APPEND":
query.accessIdsHavePermission(WorkbasketAuthorization.APPEND, accessIds); query.callerHasPermission(WorkbasketAuthorization.APPEND);
break; break;
case "TRANSFER": case "TRANSFER":
query.accessIdsHavePermission(WorkbasketAuthorization.TRANSFER, accessIds); query.callerHasPermission(WorkbasketAuthorization.TRANSFER);
break; break;
case "DISTRIBUTE": case "DISTRIBUTE":
query.accessIdsHavePermission(WorkbasketAuthorization.DISTRIBUTE, accessIds); query.callerHasPermission(WorkbasketAuthorization.DISTRIBUTE);
break; break;
case "DELETE": case "DELETE":
query.accessIdsHavePermission(WorkbasketAuthorization.DELETE, accessIds); query.callerHasPermission(WorkbasketAuthorization.DELETE);
break; break;
case "CUSTOM_1": case "CUSTOM_1":
query.accessIdsHavePermission(WorkbasketAuthorization.CUSTOM_1, accessIds); query.callerHasPermission(WorkbasketAuthorization.CUSTOM_1);
break; break;
case "CUSTOM_2": case "CUSTOM_2":
query.accessIdsHavePermission(WorkbasketAuthorization.CUSTOM_2, accessIds); query.callerHasPermission(WorkbasketAuthorization.CUSTOM_2);
break; break;
case "CUSTOM_3": case "CUSTOM_3":
query.accessIdsHavePermission(WorkbasketAuthorization.CUSTOM_3, accessIds); query.callerHasPermission(WorkbasketAuthorization.CUSTOM_3);
break; break;
case "CUSTOM_4": case "CUSTOM_4":
query.accessIdsHavePermission(WorkbasketAuthorization.CUSTOM_4, accessIds); query.callerHasPermission(WorkbasketAuthorization.CUSTOM_4);
break; break;
case "CUSTOM_5": case "CUSTOM_5":
query.accessIdsHavePermission(WorkbasketAuthorization.CUSTOM_5, accessIds); query.callerHasPermission(WorkbasketAuthorization.CUSTOM_5);
break; break;
case "CUSTOM_6": case "CUSTOM_6":
query.accessIdsHavePermission(WorkbasketAuthorization.CUSTOM_6, accessIds); query.callerHasPermission(WorkbasketAuthorization.CUSTOM_6);
break; break;
case "CUSTOM_7": case "CUSTOM_7":
query.accessIdsHavePermission(WorkbasketAuthorization.CUSTOM_7, accessIds); query.callerHasPermission(WorkbasketAuthorization.CUSTOM_7);
break; break;
case "CUSTOM_8": case "CUSTOM_8":
query.accessIdsHavePermission(WorkbasketAuthorization.CUSTOM_8, accessIds); query.callerHasPermission(WorkbasketAuthorization.CUSTOM_8);
break; break;
case "CUSTOM_9": case "CUSTOM_9":
query.accessIdsHavePermission(WorkbasketAuthorization.CUSTOM_9, accessIds); query.callerHasPermission(WorkbasketAuthorization.CUSTOM_9);
break; break;
case "CUSTOM_10": case "CUSTOM_10":
query.accessIdsHavePermission(WorkbasketAuthorization.CUSTOM_10, accessIds); query.callerHasPermission(WorkbasketAuthorization.CUSTOM_10);
break; break;
case "CUSTOM_11": case "CUSTOM_11":
query.accessIdsHavePermission(WorkbasketAuthorization.CUSTOM_11, accessIds); query.callerHasPermission(WorkbasketAuthorization.CUSTOM_11);
break; break;
case "CUSTOM_12": case "CUSTOM_12":
query.accessIdsHavePermission(WorkbasketAuthorization.CUSTOM_12, accessIds); query.callerHasPermission(WorkbasketAuthorization.CUSTOM_12);
break; break;
} }
} catch (InvalidArgumentException e) { } 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 { throws InvalidRequestException, InvalidArgumentException {
BaseQuery.SortDirection sortDirection = GetSortDirecction(order); BaseQuery.SortDirection sortDirection = getSortDirection(order);
if (sortBy.equals(NAME)) { if (sortBy.equals(NAME)) {
query.orderByKey(sortDirection); query.orderByName(sortDirection);
} else if (sortBy.equals(KEY)) { } else if (sortBy.equals(KEY)) {
query.orderByKey(sortDirection); query.orderByKey(sortDirection);
} else if (sortBy.equals(DESCRIPTION)) { } 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)) { if (order.equals(DESC)) {
return BaseQuery.SortDirection.DESCENDING; return BaseQuery.SortDirection.DESCENDING;
} }
return BaseQuery.SortDirection.ASCENDING; return BaseQuery.SortDirection.ASCENDING;
} }
private void AddFilterQuery(WorkbasketQuery query, private void addAttributeFilter(WorkbasketQuery query,
String name, String nameLike, String name, String nameLike,
String descLike, String owner, String descLike, String owner,
String ownerLike, String type) throws NotAuthorizedException, InvalidArgumentException { String ownerLike, String type) throws InvalidArgumentException {
if (!name.isEmpty()) if (name != null)
query.nameIn(name); query.nameIn(name);
if (!nameLike.isEmpty()) if (nameLike != null)
query.nameLike(LIKE + nameLike + LIKE); query.nameLike(LIKE + nameLike + LIKE);
if (!owner.isEmpty()) if (owner != null)
query.ownerIn(owner); query.ownerIn(owner);
if (!ownerLike.isEmpty()) if (ownerLike != null)
query.ownerLike(LIKE + ownerLike + LIKE); query.ownerLike(LIKE + ownerLike + LIKE);
if (!descLike.isEmpty()) if (descLike != null)
query.descriptionLike(LIKE + descLike + LIKE); query.descriptionLike(LIKE + descLike + LIKE);
switch (type) { if (type != null) {
case "PERSONAL": switch (type) {
query.typeIn(WorkbasketType.PERSONAL); case "PERSONAL":
case "GROUP": query.typeIn(WorkbasketType.PERSONAL);
query.typeIn(WorkbasketType.GROUP); case "GROUP":
case "CLEARANCE": query.typeIn(WorkbasketType.GROUP);
query.typeIn(WorkbasketType.CLEARANCE); case "CLEARANCE":
case "TOPIC": query.typeIn(WorkbasketType.CLEARANCE);
query.typeIn(WorkbasketType.TOPIC); 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;
}
}