package com.sequenceiq.cloudbreak.controller; import java.util.Set; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.core.convert.ConversionService; import org.springframework.core.convert.TypeDescriptor; import org.springframework.stereotype.Component; import com.sequenceiq.cloudbreak.api.endpoint.BlueprintEndpoint; import com.sequenceiq.cloudbreak.api.model.BlueprintRequest; import com.sequenceiq.cloudbreak.api.model.BlueprintResponse; import com.sequenceiq.cloudbreak.domain.Blueprint; import com.sequenceiq.cloudbreak.domain.CbUser; import com.sequenceiq.cloudbreak.logger.MDCBuilder; import com.sequenceiq.cloudbreak.service.blueprint.BlueprintLoaderService; import com.sequenceiq.cloudbreak.service.blueprint.BlueprintService; @Component public class BlueprintController implements BlueprintEndpoint { @Autowired private BlueprintService blueprintService; @Autowired private AuthenticatedUserService authenticatedUserService; @Autowired @Qualifier("conversionService") private ConversionService conversionService; @Autowired private BlueprintLoaderService blueprintLoaderService; @Override public BlueprintResponse postPrivate(BlueprintRequest blueprintRequest) { CbUser user = authenticatedUserService.getCbUser(); MDCBuilder.buildUserMdcContext(user); return createBlueprint(user, blueprintRequest, false); } @Override public BlueprintResponse postPublic(BlueprintRequest blueprintRequest) { CbUser user = authenticatedUserService.getCbUser(); MDCBuilder.buildUserMdcContext(user); return createBlueprint(user, blueprintRequest, true); } @Override public Set<BlueprintResponse> getPrivates() { CbUser user = authenticatedUserService.getCbUser(); MDCBuilder.buildUserMdcContext(user); Set<Blueprint> blueprints = blueprintService.retrievePrivateBlueprints(user); if (blueprints.isEmpty()) { blueprints = blueprintLoaderService.loadBlueprints(user); } return toJsonList(blueprints); } @Override public BlueprintResponse getPrivate(String name) { CbUser user = authenticatedUserService.getCbUser(); MDCBuilder.buildUserMdcContext(user); Blueprint blueprint = blueprintService.getPrivateBlueprint(name, user); return conversionService.convert(blueprint, BlueprintResponse.class); } @Override public BlueprintResponse getPublic(String name) { CbUser user = authenticatedUserService.getCbUser(); Blueprint blueprint = blueprintService.getPublicBlueprint(name, user); return conversionService.convert(blueprint, BlueprintResponse.class); } @Override public Set<BlueprintResponse> getPublics() { CbUser user = authenticatedUserService.getCbUser(); MDCBuilder.buildUserMdcContext(user); blueprintLoaderService.loadBlueprints(user); Set<Blueprint> blueprints = blueprintService.retrieveAccountBlueprints(user); return toJsonList(blueprints); } @Override public BlueprintResponse get(Long id) { CbUser user = authenticatedUserService.getCbUser(); MDCBuilder.buildUserMdcContext(user); Blueprint blueprint = blueprintService.get(id); return conversionService.convert(blueprint, BlueprintResponse.class); } @Override public void delete(Long id) { CbUser user = authenticatedUserService.getCbUser(); MDCBuilder.buildUserMdcContext(user); blueprintService.delete(id, user); } @Override public void deletePublic(String name) { CbUser user = authenticatedUserService.getCbUser(); MDCBuilder.buildUserMdcContext(user); blueprintService.delete(name, user); } @Override public void deletePrivate(String name) { CbUser user = authenticatedUserService.getCbUser(); MDCBuilder.buildUserMdcContext(user); blueprintService.delete(name, user); } private BlueprintResponse createBlueprint(CbUser user, BlueprintRequest blueprintRequest, boolean publicInAccount) { Blueprint blueprint = conversionService.convert(blueprintRequest, Blueprint.class); blueprint.setPublicInAccount(publicInAccount); blueprint = blueprintService.create(user, blueprint, blueprintRequest.getProperties()); return conversionService.convert(blueprint, BlueprintResponse.class); } private Set<BlueprintResponse> toJsonList(Set<Blueprint> blueprints) { return (Set<BlueprintResponse>) conversionService.convert(blueprints, TypeDescriptor.forObject(blueprints), TypeDescriptor.collection(Set.class, TypeDescriptor.valueOf(BlueprintResponse.class))); } }