TSK-301 import all classifications

This commit is contained in:
Lars Leo Grätz 2018-02-22 17:49:19 +01:00 committed by Mustapha Zorgati
parent 25107f5760
commit 633bc2372f
10 changed files with 95 additions and 45 deletions

View File

@ -75,6 +75,4 @@
</plugin> </plugin>
</plugins> </plugins>
</build> </build>
</project> </project>

View File

@ -2,13 +2,19 @@ package pro.taskana.rest;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
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;
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.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
@ -16,7 +22,9 @@ import pro.taskana.Classification;
import pro.taskana.ClassificationQuery; import pro.taskana.ClassificationQuery;
import pro.taskana.ClassificationService; import pro.taskana.ClassificationService;
import pro.taskana.ClassificationSummary; import pro.taskana.ClassificationSummary;
import pro.taskana.exceptions.ClassificationAlreadyExistException;
import pro.taskana.exceptions.ClassificationNotFoundException; import pro.taskana.exceptions.ClassificationNotFoundException;
import pro.taskana.exceptions.NotAuthorizedException;
import pro.taskana.rest.resource.ClassificationResource; import pro.taskana.rest.resource.ClassificationResource;
import pro.taskana.rest.resource.mapper.ClassificationMapper; import pro.taskana.rest.resource.mapper.ClassificationMapper;
@ -30,22 +38,52 @@ public class ClassificationDefinitionController {
@Autowired @Autowired
private ClassificationMapper classificationMapper; private ClassificationMapper classificationMapper;
@RequestMapping(method = RequestMethod.GET) @GetMapping
public ResponseEntity<List<ClassificationResource>> getClassifications(@RequestParam(required = false) String domain) { @Transactional(readOnly = true, rollbackFor = Exception.class)
public ResponseEntity<List<ClassificationResource>> getClassifications(
@RequestParam(required = false) String domain) {
try { try {
ClassificationQuery query = classificationService.createClassificationQuery(); ClassificationQuery query = classificationService.createClassificationQuery();
List<ClassificationSummary> summaries = domain != null ? query.domainIn(domain).list() : query.list(); List<ClassificationSummary> summaries = domain != null ? query.domainIn(domain).list() : query.list();
List<ClassificationResource> export = new ArrayList<>(); List<ClassificationResource> export = new ArrayList<>();
for (ClassificationSummary summary : summaries) { 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)); export.add(classificationMapper.toResource(classification));
} }
return new ResponseEntity<>(export, HttpStatus.OK); return new ResponseEntity<>(export, HttpStatus.OK);
} catch (ClassificationNotFoundException e) { } catch (ClassificationNotFoundException e) {
return new ResponseEntity<>(HttpStatus.NOT_FOUND); return new ResponseEntity<>(HttpStatus.NOT_FOUND);
} }
}
@PostMapping(path = "/import")
@Transactional(rollbackFor = Exception.class)
public ResponseEntity<String> importClassifications(
@RequestBody List<ClassificationResource> classificationResources) {
try {
Map<String, String> 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);
} }
} }

View File

@ -17,6 +17,8 @@ import org.springframework.context.annotation.Primary;
import org.springframework.context.annotation.Scope; import org.springframework.context.annotation.Scope;
import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder; import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder;
import org.springframework.http.converter.json.SpringHandlerInstantiator; 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 org.springframework.transaction.annotation.EnableTransactionManagement;
import com.fasterxml.jackson.databind.cfg.HandlerInstantiator; import com.fasterxml.jackson.databind.cfg.HandlerInstantiator;
@ -28,11 +30,6 @@ import pro.taskana.TaskanaEngine;
import pro.taskana.WorkbasketService; import pro.taskana.WorkbasketService;
import pro.taskana.configuration.SpringTaskanaEngineConfiguration; import pro.taskana.configuration.SpringTaskanaEngineConfiguration;
import pro.taskana.configuration.TaskanaEngineConfiguration; 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; import pro.taskana.sampledata.SampleDataGenerator;
@SpringBootApplication @SpringBootApplication
@ -79,31 +76,6 @@ public class RestApplication {
return taskanaEngine.getWorkbasketService(); 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 @Bean
@Scope(ConfigurableBeanFactory.SCOPE_SINGLETON) @Scope(ConfigurableBeanFactory.SCOPE_SINGLETON)
public TaskanaEngine getTaskanaEngine(TaskanaEngineConfiguration taskanaEngineConfiguration) throws SQLException { public TaskanaEngine getTaskanaEngine(TaskanaEngineConfiguration taskanaEngineConfiguration) throws SQLException {
@ -146,4 +118,9 @@ public class RestApplication {
return new SpringHandlerInstantiator(context.getAutowireCapableBeanFactory()); return new SpringHandlerInstantiator(context.getAutowireCapableBeanFactory());
} }
@Bean
public PlatformTransactionManager txManager(DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
} }

View File

@ -27,6 +27,7 @@ public class ClassificationResource extends ResourceSupport {
public String custom8; public String custom8;
public ClassificationResource() { public ClassificationResource() {
// necessary for deserializing
} }
public ClassificationResource(String classificationId, String key, String parentId, String category, String type, public ClassificationResource(String classificationId, String key, String parentId, String category, String type,

View File

@ -1,10 +1,17 @@
package pro.taskana.rest.resource.mapper; 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.Classification;
import pro.taskana.ClassificationService;
import pro.taskana.rest.resource.ClassificationResource; import pro.taskana.rest.resource.ClassificationResource;
@Component
public class ClassificationMapper { public class ClassificationMapper {
@Autowired ClassificationService classificationService;
public ClassificationResource toResource(Classification classification) { public ClassificationResource toResource(Classification classification) {
return new ClassificationResource( return new ClassificationResource(
classification.getId(), classification.getId(),
@ -30,4 +37,25 @@ public class ClassificationMapper {
classification.getCustom8()); 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;
}
} }

View File

@ -4,6 +4,7 @@ import static org.springframework.hateoas.mvc.ControllerLinkBuilder.linkTo;
import static org.springframework.hateoas.mvc.ControllerLinkBuilder.methodOn; import static org.springframework.hateoas.mvc.ControllerLinkBuilder.methodOn;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import pro.taskana.WorkbasketAccessItem; import pro.taskana.WorkbasketAccessItem;
import pro.taskana.WorkbasketService; import pro.taskana.WorkbasketService;
@ -11,6 +12,7 @@ import pro.taskana.impl.WorkbasketAccessItemImpl;
import pro.taskana.rest.WorkbasketController; import pro.taskana.rest.WorkbasketController;
import pro.taskana.rest.resource.WorkbasketAccessItemResource; import pro.taskana.rest.resource.WorkbasketAccessItemResource;
@Component
public class WorkbasketAccessItemMapper { public class WorkbasketAccessItemMapper {
@Autowired @Autowired

View File

@ -1,7 +1,12 @@
package pro.taskana.rest.resource.mapper; 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.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Component;
import pro.taskana.Workbasket; import pro.taskana.Workbasket;
import pro.taskana.WorkbasketAccessItem; import pro.taskana.WorkbasketAccessItem;
import pro.taskana.WorkbasketService; import pro.taskana.WorkbasketService;
@ -10,11 +15,7 @@ import pro.taskana.exceptions.NotAuthorizedException;
import pro.taskana.exceptions.WorkbasketNotFoundException; import pro.taskana.exceptions.WorkbasketNotFoundException;
import pro.taskana.rest.resource.WorkbasketDefinition; import pro.taskana.rest.resource.WorkbasketDefinition;
import java.util.List; @Component
import java.util.Set;
import java.util.stream.Collectors;
@Service
public class WorkbasketDefinitionMapper { public class WorkbasketDefinitionMapper {
@Autowired @Autowired

View File

@ -6,6 +6,7 @@ import static org.springframework.hateoas.mvc.ControllerLinkBuilder.methodOn;
import java.time.Instant; import java.time.Instant;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import pro.taskana.Workbasket; import pro.taskana.Workbasket;
import pro.taskana.WorkbasketService; import pro.taskana.WorkbasketService;
@ -13,6 +14,7 @@ import pro.taskana.impl.WorkbasketImpl;
import pro.taskana.rest.WorkbasketController; import pro.taskana.rest.WorkbasketController;
import pro.taskana.rest.resource.WorkbasketResource; import pro.taskana.rest.resource.WorkbasketResource;
@Component
public class WorkbasketMapper { public class WorkbasketMapper {
@Autowired @Autowired

View File

@ -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.linkTo;
import static org.springframework.hateoas.mvc.ControllerLinkBuilder.methodOn; import static org.springframework.hateoas.mvc.ControllerLinkBuilder.methodOn;
import org.springframework.stereotype.Component;
import pro.taskana.WorkbasketSummary; import pro.taskana.WorkbasketSummary;
import pro.taskana.rest.WorkbasketController; import pro.taskana.rest.WorkbasketController;
import pro.taskana.rest.resource.WorkbasketSummaryResource; import pro.taskana.rest.resource.WorkbasketSummaryResource;
@Component
public class WorkbasketSummaryMapper { public class WorkbasketSummaryMapper {
public WorkbasketSummaryResource toResource(WorkbasketSummary summary) { public WorkbasketSummaryResource toResource(WorkbasketSummary summary) {

View File

@ -42,9 +42,9 @@ public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Bean @Bean
public JaasAuthenticationProvider jaasAuthProvider() { public JaasAuthenticationProvider jaasAuthProvider() {
JaasAuthenticationProvider authenticationProvider = new JaasAuthenticationProvider(); JaasAuthenticationProvider authenticationProvider = new JaasAuthenticationProvider();
authenticationProvider.setAuthorityGranters(new AuthorityGranter[] { new SampleRoleGranter() }); authenticationProvider.setAuthorityGranters(new AuthorityGranter[] {new SampleRoleGranter()});
authenticationProvider.setCallbackHandlers(new JaasAuthenticationCallbackHandler[] { authenticationProvider.setCallbackHandlers(new JaasAuthenticationCallbackHandler[] {
new JaasNameCallbackHandler(), new JaasPasswordCallbackHandler() }); new JaasNameCallbackHandler(), new JaasPasswordCallbackHandler()});
authenticationProvider.setLoginContextName("taskana"); authenticationProvider.setLoginContextName("taskana");
authenticationProvider.setLoginConfig(new ClassPathResource("pss_jaas.config")); authenticationProvider.setLoginConfig(new ClassPathResource("pss_jaas.config"));
return authenticationProvider; return authenticationProvider;