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>
</plugins>
</build>
</project>

View File

@ -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<List<ClassificationResource>> getClassifications(@RequestParam(required = false) String domain) {
@GetMapping
@Transactional(readOnly = true, rollbackFor = Exception.class)
public ResponseEntity<List<ClassificationResource>> getClassifications(
@RequestParam(required = false) String domain) {
try {
ClassificationQuery query = classificationService.createClassificationQuery();
List<ClassificationSummary> summaries = domain != null ? query.domainIn(domain).list() : query.list();
List<ClassificationResource> 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<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.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);
}
}

View File

@ -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,

View File

@ -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;
}
}

View File

@ -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

View File

@ -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

View File

@ -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

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.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) {

View File

@ -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;