From 633bc2372f3049ce692d366b6f67462281760791 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lars=20Leo=20Gr=C3=A4tz?= <23726273+LarsLeo@users.noreply.github.com> Date: Thu, 22 Feb 2018 17:49:19 +0100 Subject: [PATCH] TSK-301 import all classifications --- rest/pom.xml | 2 - .../ClassificationDefinitionController.java | 48 +++++++++++++++++-- .../pro/taskana/rest/RestApplication.java | 37 +++----------- .../rest/resource/ClassificationResource.java | 1 + .../resource/mapper/ClassificationMapper.java | 28 +++++++++++ .../mapper/WorkbasketAccessItemMapper.java | 2 + .../mapper/WorkbasketDefinitionMapper.java | 13 ++--- .../resource/mapper/WorkbasketMapper.java | 2 + .../mapper/WorkbasketSummaryMapper.java | 3 ++ .../rest/security/WebSecurityConfig.java | 4 +- 10 files changed, 95 insertions(+), 45 deletions(-) diff --git a/rest/pom.xml b/rest/pom.xml index 3ee6046bf..d2294afe7 100644 --- a/rest/pom.xml +++ b/rest/pom.xml @@ -75,6 +75,4 @@ - - diff --git a/rest/src/main/java/pro/taskana/rest/ClassificationDefinitionController.java b/rest/src/main/java/pro/taskana/rest/ClassificationDefinitionController.java index 1f5587b8e..28dbf4b8a 100644 --- a/rest/src/main/java/pro/taskana/rest/ClassificationDefinitionController.java +++ b/rest/src/main/java/pro/taskana/rest/ClassificationDefinitionController.java @@ -2,13 +2,19 @@ package pro.taskana.rest; import java.util.ArrayList; import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.transaction.interceptor.TransactionInterceptor; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; @@ -16,7 +22,9 @@ import pro.taskana.Classification; import pro.taskana.ClassificationQuery; import pro.taskana.ClassificationService; import pro.taskana.ClassificationSummary; +import pro.taskana.exceptions.ClassificationAlreadyExistException; import pro.taskana.exceptions.ClassificationNotFoundException; +import pro.taskana.exceptions.NotAuthorizedException; import pro.taskana.rest.resource.ClassificationResource; import pro.taskana.rest.resource.mapper.ClassificationMapper; @@ -30,22 +38,52 @@ public class ClassificationDefinitionController { @Autowired private ClassificationMapper classificationMapper; - @RequestMapping(method = RequestMethod.GET) - public ResponseEntity> getClassifications(@RequestParam(required = false) String domain) { + @GetMapping + @Transactional(readOnly = true, rollbackFor = Exception.class) + public ResponseEntity> getClassifications( + @RequestParam(required = false) String domain) { try { ClassificationQuery query = classificationService.createClassificationQuery(); List summaries = domain != null ? query.domainIn(domain).list() : query.list(); List export = new ArrayList<>(); for (ClassificationSummary summary : summaries) { - Classification classification = classificationService.getClassification(summary.getKey(), summary.getDomain()); + Classification classification = classificationService.getClassification(summary.getKey(), + summary.getDomain()); export.add(classificationMapper.toResource(classification)); } - return new ResponseEntity<>(export, HttpStatus.OK); } catch (ClassificationNotFoundException e) { return new ResponseEntity<>(HttpStatus.NOT_FOUND); } + } + @PostMapping(path = "/import") + @Transactional(rollbackFor = Exception.class) + public ResponseEntity importClassifications( + @RequestBody List classificationResources) { + try { + Map systemIds = classificationService.createClassificationQuery().list().stream() + .collect(Collectors.toMap(i -> i.getKey() + i.getDomain(), ClassificationSummary::getId)); + + for (ClassificationResource classificationResource : classificationResources) { + Classification classification = classificationMapper.toModel(classificationResource); + if (systemIds.containsKey(classificationResource.key + classificationResource.domain)) + classificationService.updateClassification(classification); + else + classificationService.createClassification(classification); + } + } catch (ClassificationNotFoundException e) { + TransactionInterceptor.currentTransactionStatus().setRollbackOnly(); + return new ResponseEntity<>(HttpStatus.NOT_FOUND); + } catch (NotAuthorizedException e) { + TransactionInterceptor.currentTransactionStatus().setRollbackOnly(); + return new ResponseEntity<>(HttpStatus.UNAUTHORIZED); + } catch (ClassificationAlreadyExistException e) { + TransactionInterceptor.currentTransactionStatus().setRollbackOnly(); + return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR); + } + + return new ResponseEntity<>(HttpStatus.OK); } } diff --git a/rest/src/main/java/pro/taskana/rest/RestApplication.java b/rest/src/main/java/pro/taskana/rest/RestApplication.java index dea38c640..73257f3fa 100644 --- a/rest/src/main/java/pro/taskana/rest/RestApplication.java +++ b/rest/src/main/java/pro/taskana/rest/RestApplication.java @@ -17,6 +17,8 @@ import org.springframework.context.annotation.Primary; import org.springframework.context.annotation.Scope; import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder; import org.springframework.http.converter.json.SpringHandlerInstantiator; +import org.springframework.jdbc.datasource.DataSourceTransactionManager; +import org.springframework.transaction.PlatformTransactionManager; import org.springframework.transaction.annotation.EnableTransactionManagement; import com.fasterxml.jackson.databind.cfg.HandlerInstantiator; @@ -28,11 +30,6 @@ import pro.taskana.TaskanaEngine; import pro.taskana.WorkbasketService; import pro.taskana.configuration.SpringTaskanaEngineConfiguration; import pro.taskana.configuration.TaskanaEngineConfiguration; -import pro.taskana.rest.resource.mapper.ClassificationMapper; -import pro.taskana.rest.resource.mapper.WorkbasketAccessItemMapper; -import pro.taskana.rest.resource.mapper.WorkbasketDefinitionMapper; -import pro.taskana.rest.resource.mapper.WorkbasketMapper; -import pro.taskana.rest.resource.mapper.WorkbasketSummaryMapper; import pro.taskana.sampledata.SampleDataGenerator; @SpringBootApplication @@ -79,31 +76,6 @@ public class RestApplication { return taskanaEngine.getWorkbasketService(); } - @Bean - public WorkbasketSummaryMapper getWorkbasketSummaryMapper() { - return new WorkbasketSummaryMapper(); - } - - @Bean - public WorkbasketMapper getWorkbasketMapper() { - return new WorkbasketMapper(); - } - - @Bean - public WorkbasketAccessItemMapper getWorkbasketAccessItemMapper() { - return new WorkbasketAccessItemMapper(); - } - - @Bean - public WorkbasketDefinitionMapper getWorkbasketDefinitionMapper() { - return new WorkbasketDefinitionMapper(); - } - - @Bean - public ClassificationMapper getClassificationMapper() { - return new ClassificationMapper(); - } - @Bean @Scope(ConfigurableBeanFactory.SCOPE_SINGLETON) public TaskanaEngine getTaskanaEngine(TaskanaEngineConfiguration taskanaEngineConfiguration) throws SQLException { @@ -146,4 +118,9 @@ public class RestApplication { return new SpringHandlerInstantiator(context.getAutowireCapableBeanFactory()); } + @Bean + public PlatformTransactionManager txManager(DataSource dataSource) { + return new DataSourceTransactionManager(dataSource); + } + } diff --git a/rest/src/main/java/pro/taskana/rest/resource/ClassificationResource.java b/rest/src/main/java/pro/taskana/rest/resource/ClassificationResource.java index a0bdc346c..1aecbe9b6 100644 --- a/rest/src/main/java/pro/taskana/rest/resource/ClassificationResource.java +++ b/rest/src/main/java/pro/taskana/rest/resource/ClassificationResource.java @@ -27,6 +27,7 @@ public class ClassificationResource extends ResourceSupport { public String custom8; public ClassificationResource() { + // necessary for deserializing } public ClassificationResource(String classificationId, String key, String parentId, String category, String type, diff --git a/rest/src/main/java/pro/taskana/rest/resource/mapper/ClassificationMapper.java b/rest/src/main/java/pro/taskana/rest/resource/mapper/ClassificationMapper.java index 0159b52f0..a614e2824 100644 --- a/rest/src/main/java/pro/taskana/rest/resource/mapper/ClassificationMapper.java +++ b/rest/src/main/java/pro/taskana/rest/resource/mapper/ClassificationMapper.java @@ -1,10 +1,17 @@ package pro.taskana.rest.resource.mapper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + import pro.taskana.Classification; +import pro.taskana.ClassificationService; import pro.taskana.rest.resource.ClassificationResource; +@Component public class ClassificationMapper { + @Autowired ClassificationService classificationService; + public ClassificationResource toResource(Classification classification) { return new ClassificationResource( classification.getId(), @@ -30,4 +37,25 @@ public class ClassificationMapper { classification.getCustom8()); } + public Classification toModel(ClassificationResource classificationResource) { + Classification classification = classificationService.newClassification(classificationResource.domain, + classificationResource.key, classificationResource.type); + classification.setServiceLevel(classificationResource.serviceLevel); + classification.setPriority(classificationResource.priority); + classification.setParentId(classificationResource.parentId); + classification.setName(classificationResource.name); + classification.setIsValidInDomain(classificationResource.isValidInDomain); + classification.setDescription(classificationResource.description); + classification.setCustom1(classificationResource.custom1); + classification.setCustom2(classificationResource.custom2); + classification.setCustom3(classificationResource.custom3); + classification.setCustom4(classificationResource.custom4); + classification.setCustom5(classificationResource.custom5); + classification.setCustom6(classificationResource.custom6); + classification.setCustom7(classificationResource.custom7); + classification.setCustom8(classificationResource.custom8); + classification.setCategory(classificationResource.category); + classification.setApplicationEntryPoint(classificationResource.applicationEntryPoint); + return classification; + } } diff --git a/rest/src/main/java/pro/taskana/rest/resource/mapper/WorkbasketAccessItemMapper.java b/rest/src/main/java/pro/taskana/rest/resource/mapper/WorkbasketAccessItemMapper.java index c00fcb344..133f98e95 100644 --- a/rest/src/main/java/pro/taskana/rest/resource/mapper/WorkbasketAccessItemMapper.java +++ b/rest/src/main/java/pro/taskana/rest/resource/mapper/WorkbasketAccessItemMapper.java @@ -4,6 +4,7 @@ import static org.springframework.hateoas.mvc.ControllerLinkBuilder.linkTo; import static org.springframework.hateoas.mvc.ControllerLinkBuilder.methodOn; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; import pro.taskana.WorkbasketAccessItem; import pro.taskana.WorkbasketService; @@ -11,6 +12,7 @@ import pro.taskana.impl.WorkbasketAccessItemImpl; import pro.taskana.rest.WorkbasketController; import pro.taskana.rest.resource.WorkbasketAccessItemResource; +@Component public class WorkbasketAccessItemMapper { @Autowired diff --git a/rest/src/main/java/pro/taskana/rest/resource/mapper/WorkbasketDefinitionMapper.java b/rest/src/main/java/pro/taskana/rest/resource/mapper/WorkbasketDefinitionMapper.java index 810d58cae..c799afcf2 100644 --- a/rest/src/main/java/pro/taskana/rest/resource/mapper/WorkbasketDefinitionMapper.java +++ b/rest/src/main/java/pro/taskana/rest/resource/mapper/WorkbasketDefinitionMapper.java @@ -1,7 +1,12 @@ package pro.taskana.rest.resource.mapper; +import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; + import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; + import pro.taskana.Workbasket; import pro.taskana.WorkbasketAccessItem; import pro.taskana.WorkbasketService; @@ -10,11 +15,7 @@ import pro.taskana.exceptions.NotAuthorizedException; import pro.taskana.exceptions.WorkbasketNotFoundException; import pro.taskana.rest.resource.WorkbasketDefinition; -import java.util.List; -import java.util.Set; -import java.util.stream.Collectors; - -@Service +@Component public class WorkbasketDefinitionMapper { @Autowired diff --git a/rest/src/main/java/pro/taskana/rest/resource/mapper/WorkbasketMapper.java b/rest/src/main/java/pro/taskana/rest/resource/mapper/WorkbasketMapper.java index 4d2690291..464977729 100644 --- a/rest/src/main/java/pro/taskana/rest/resource/mapper/WorkbasketMapper.java +++ b/rest/src/main/java/pro/taskana/rest/resource/mapper/WorkbasketMapper.java @@ -6,6 +6,7 @@ import static org.springframework.hateoas.mvc.ControllerLinkBuilder.methodOn; import java.time.Instant; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; import pro.taskana.Workbasket; import pro.taskana.WorkbasketService; @@ -13,6 +14,7 @@ import pro.taskana.impl.WorkbasketImpl; import pro.taskana.rest.WorkbasketController; import pro.taskana.rest.resource.WorkbasketResource; +@Component public class WorkbasketMapper { @Autowired diff --git a/rest/src/main/java/pro/taskana/rest/resource/mapper/WorkbasketSummaryMapper.java b/rest/src/main/java/pro/taskana/rest/resource/mapper/WorkbasketSummaryMapper.java index 17f7300ba..3cdcccc7e 100644 --- a/rest/src/main/java/pro/taskana/rest/resource/mapper/WorkbasketSummaryMapper.java +++ b/rest/src/main/java/pro/taskana/rest/resource/mapper/WorkbasketSummaryMapper.java @@ -3,10 +3,13 @@ package pro.taskana.rest.resource.mapper; import static org.springframework.hateoas.mvc.ControllerLinkBuilder.linkTo; import static org.springframework.hateoas.mvc.ControllerLinkBuilder.methodOn; +import org.springframework.stereotype.Component; + import pro.taskana.WorkbasketSummary; import pro.taskana.rest.WorkbasketController; import pro.taskana.rest.resource.WorkbasketSummaryResource; +@Component public class WorkbasketSummaryMapper { public WorkbasketSummaryResource toResource(WorkbasketSummary summary) { diff --git a/rest/src/main/java/pro/taskana/rest/security/WebSecurityConfig.java b/rest/src/main/java/pro/taskana/rest/security/WebSecurityConfig.java index 5757174d3..b4eb392ed 100644 --- a/rest/src/main/java/pro/taskana/rest/security/WebSecurityConfig.java +++ b/rest/src/main/java/pro/taskana/rest/security/WebSecurityConfig.java @@ -42,9 +42,9 @@ public class WebSecurityConfig extends WebSecurityConfigurerAdapter { @Bean public JaasAuthenticationProvider jaasAuthProvider() { JaasAuthenticationProvider authenticationProvider = new JaasAuthenticationProvider(); - authenticationProvider.setAuthorityGranters(new AuthorityGranter[] { new SampleRoleGranter() }); + authenticationProvider.setAuthorityGranters(new AuthorityGranter[] {new SampleRoleGranter()}); authenticationProvider.setCallbackHandlers(new JaasAuthenticationCallbackHandler[] { - new JaasNameCallbackHandler(), new JaasPasswordCallbackHandler() }); + new JaasNameCallbackHandler(), new JaasPasswordCallbackHandler()}); authenticationProvider.setLoginContextName("taskana"); authenticationProvider.setLoginConfig(new ClassPathResource("pss_jaas.config")); return authenticationProvider;