From 1cbe627272bd5366dc114ddc7b99e3e8ccc0c06e Mon Sep 17 00:00:00 2001 From: siddhantsorann Date: Sat, 23 Jan 2021 12:08:45 +0530 Subject: [PATCH 1/7] Added new dao to handle predicates --- .../BootVersionsCompletionProviderTests.java | 3 +- .../completion/CompletionTestsMocks.java | 3 +- .../repository/AppRegistrationDao.java | 86 +++++++++++++++++++ .../registry/service/AppRegistryService.java | 14 ++- .../service/DefaultAppRegistryService.java | 15 +++- .../DefaultAppRegistryServiceTests.java | 4 +- .../DataFlowControllerAutoConfiguration.java | 8 +- .../controller/AppRegistryController.java | 37 +++++++- .../TabOnTapCompletionProviderTests.java | 3 +- .../server/configuration/JobDependencies.java | 4 +- .../configuration/TestDependencies.java | 4 +- .../single/DataFlowServerApplication.java | 3 + 12 files changed, 170 insertions(+), 14 deletions(-) create mode 100644 spring-cloud-dataflow-registry/src/main/java/org/springframework/cloud/dataflow/registry/repository/AppRegistrationDao.java diff --git a/spring-cloud-dataflow-completion/src/test/java/org/springframework/cloud/dataflow/completion/BootVersionsCompletionProviderTests.java b/spring-cloud-dataflow-completion/src/test/java/org/springframework/cloud/dataflow/completion/BootVersionsCompletionProviderTests.java index 9a7a8bdfea..ba81e4889e 100644 --- a/spring-cloud-dataflow-completion/src/test/java/org/springframework/cloud/dataflow/completion/BootVersionsCompletionProviderTests.java +++ b/spring-cloud-dataflow-completion/src/test/java/org/springframework/cloud/dataflow/completion/BootVersionsCompletionProviderTests.java @@ -37,6 +37,7 @@ import org.springframework.cloud.dataflow.core.ApplicationType; import org.springframework.cloud.dataflow.core.DefaultStreamDefinitionService; import org.springframework.cloud.dataflow.core.StreamDefinitionService; +import org.springframework.cloud.dataflow.registry.repository.AppRegistrationDao; import org.springframework.cloud.dataflow.registry.repository.AppRegistrationRepository; import org.springframework.cloud.dataflow.registry.service.AppRegistryService; import org.springframework.cloud.dataflow.registry.service.DefaultAppRegistryService; @@ -128,7 +129,7 @@ public AppRegistryService appRegistry() { return new DefaultAppRegistryService(mock(AppRegistrationRepository.class), new AppResourceCommon(new MavenProperties(), new FileSystemResourceLoader()), - mock(DefaultAuditRecordService.class)) { + mock(DefaultAuditRecordService.class), mock(AppRegistrationDao.class)) { @Override public boolean appExist(String name, ApplicationType type) { diff --git a/spring-cloud-dataflow-completion/src/test/java/org/springframework/cloud/dataflow/completion/CompletionTestsMocks.java b/spring-cloud-dataflow-completion/src/test/java/org/springframework/cloud/dataflow/completion/CompletionTestsMocks.java index 5228350c25..d47d85428c 100644 --- a/spring-cloud-dataflow-completion/src/test/java/org/springframework/cloud/dataflow/completion/CompletionTestsMocks.java +++ b/spring-cloud-dataflow-completion/src/test/java/org/springframework/cloud/dataflow/completion/CompletionTestsMocks.java @@ -35,6 +35,7 @@ import org.springframework.cloud.dataflow.core.ApplicationType; import org.springframework.cloud.dataflow.core.DefaultStreamDefinitionService; import org.springframework.cloud.dataflow.core.StreamDefinitionService; +import org.springframework.cloud.dataflow.registry.repository.AppRegistrationDao; import org.springframework.cloud.dataflow.registry.repository.AppRegistrationRepository; import org.springframework.cloud.dataflow.registry.service.AppRegistryService; import org.springframework.cloud.dataflow.registry.service.DefaultAppRegistryService; @@ -74,7 +75,7 @@ public AppRegistryService appRegistry() { return new DefaultAppRegistryService(mock(AppRegistrationRepository.class), new AppResourceCommon(new MavenProperties(), new FileSystemResourceLoader()), - mock(DefaultAuditRecordService.class)) { + mock(DefaultAuditRecordService.class), mock(AppRegistrationDao.class)) { @Override public boolean appExist(String name, ApplicationType type) { diff --git a/spring-cloud-dataflow-registry/src/main/java/org/springframework/cloud/dataflow/registry/repository/AppRegistrationDao.java b/spring-cloud-dataflow-registry/src/main/java/org/springframework/cloud/dataflow/registry/repository/AppRegistrationDao.java new file mode 100644 index 0000000000..0678869ada --- /dev/null +++ b/spring-cloud-dataflow-registry/src/main/java/org/springframework/cloud/dataflow/registry/repository/AppRegistrationDao.java @@ -0,0 +1,86 @@ +/* + * Copyright 2021 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.cloud.dataflow.registry.repository; + +import java.util.ArrayList; +import java.util.List; + +import javax.persistence.EntityManager; +import javax.persistence.TypedQuery; +import javax.persistence.criteria.CriteriaBuilder; +import javax.persistence.criteria.CriteriaQuery; +import javax.persistence.criteria.Predicate; +import javax.persistence.criteria.Root; + +import org.springframework.cloud.dataflow.core.AppRegistration; +import org.springframework.cloud.dataflow.core.ApplicationType; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageImpl; +import org.springframework.data.domain.Pageable; +import org.springframework.data.jpa.repository.query.QueryUtils; +import org.springframework.stereotype.Component; +import org.springframework.util.Assert; +import org.springframework.util.StringUtils; + +@Component +public class AppRegistrationDao { + + private final EntityManager entityManager; + + public AppRegistrationDao(EntityManager entityManager) { + Assert.notNull(entityManager, "Entity manager cannot be null"); + this.entityManager = entityManager; + } + + public Page findAllByTypeAndNameIsLikeAndVersionAndDefaultVersion(ApplicationType type, + String name, String version, boolean defaultVersion, Pageable pageable) { + CriteriaBuilder cb = entityManager.getCriteriaBuilder(); + CriteriaQuery cq = cb.createQuery(AppRegistration.class); + Root appRegistrationRoot = cq.from(AppRegistration.class); + final List predicates = new ArrayList<>(); + if (type != null) { + predicates.add(cb.equal(appRegistrationRoot.get("type"), type)); + } + if (StringUtils.hasText(name)) { + predicates.add(cb.like(cb.lower(appRegistrationRoot.get("name")), name.toLowerCase())); + } + if (StringUtils.hasText(version)) { + predicates.add(cb.equal(cb.lower(appRegistrationRoot.get("version")), version.toLowerCase())); + } + if (defaultVersion) { + predicates.add(cb.isTrue(appRegistrationRoot.get("defaultVersion"))); + } + cq.where(predicates.toArray(new Predicate[0])); + cq.orderBy(QueryUtils.toOrders(pageable.getSort(), appRegistrationRoot, cb)); + TypedQuery query = entityManager.createQuery(cq); + query.setFirstResult((int) pageable.getOffset()); + query.setMaxResults(pageable.getPageSize()); + final List resultList = query.getResultList(); + return new PageImpl<>(resultList, pageable, getTotalCount(cb, predicates.toArray(new Predicate[0]))); + } + + private Long getTotalCount(CriteriaBuilder criteriaBuilder, Predicate[] predicateArray) { + CriteriaQuery criteriaQuery = criteriaBuilder.createQuery(Long.class); + Root root = criteriaQuery.from(AppRegistration.class); + + criteriaQuery.select(criteriaBuilder.count(root)); + criteriaQuery.where(predicateArray); + + return entityManager.createQuery(criteriaQuery).getSingleResult(); + } + +} diff --git a/spring-cloud-dataflow-registry/src/main/java/org/springframework/cloud/dataflow/registry/service/AppRegistryService.java b/spring-cloud-dataflow-registry/src/main/java/org/springframework/cloud/dataflow/registry/service/AppRegistryService.java index 19ea19a494..9993809c65 100644 --- a/spring-cloud-dataflow-registry/src/main/java/org/springframework/cloud/dataflow/registry/service/AppRegistryService.java +++ b/spring-cloud-dataflow-registry/src/main/java/org/springframework/cloud/dataflow/registry/service/AppRegistryService.java @@ -105,7 +105,7 @@ public interface AppRegistryService { Page findAll(Pageable pageable); /** - * @param type appliation type + * @param type application type * @param name application name * @param pageable Pagination information * @return returns all {@link AppRegistration} versions for given name and type. Uses the @@ -113,6 +113,18 @@ public interface AppRegistryService { */ Page findAllByTypeAndNameIsLike(ApplicationType type, String name, Pageable pageable); + /** + * @param type application type + * @param name application name + * @param version application version + * @param defaultVersion application default version + * @param pageable Pagination information + * @return returns all {@link AppRegistration} versions for given name and type. Uses the + * pagination. + */ + Page findAllByTypeAndNameIsLikeAndVersionAndDefaultVersion(ApplicationType type, + String name, String version, boolean defaultVersion, Pageable pageable); + /** * @param type appliation type diff --git a/spring-cloud-dataflow-registry/src/main/java/org/springframework/cloud/dataflow/registry/service/DefaultAppRegistryService.java b/spring-cloud-dataflow-registry/src/main/java/org/springframework/cloud/dataflow/registry/service/DefaultAppRegistryService.java index 4ff381dee8..2a185a54bd 100644 --- a/spring-cloud-dataflow-registry/src/main/java/org/springframework/cloud/dataflow/registry/service/DefaultAppRegistryService.java +++ b/spring-cloud-dataflow-registry/src/main/java/org/springframework/cloud/dataflow/registry/service/DefaultAppRegistryService.java @@ -39,6 +39,7 @@ import org.springframework.cloud.dataflow.core.ApplicationType; import org.springframework.cloud.dataflow.core.AuditActionType; import org.springframework.cloud.dataflow.core.AuditOperationType; +import org.springframework.cloud.dataflow.registry.repository.AppRegistrationDao; import org.springframework.cloud.dataflow.registry.repository.AppRegistrationRepository; import org.springframework.cloud.dataflow.registry.support.AppResourceCommon; import org.springframework.cloud.dataflow.registry.support.NoSuchAppRegistrationException; @@ -87,15 +88,20 @@ public class DefaultAppRegistryService implements AppRegistryService { protected final AuditServiceUtils auditServiceUtils; + private final AppRegistrationDao appRegistrationDao; + public DefaultAppRegistryService(AppRegistrationRepository appRegistrationRepository, - AppResourceCommon appResourceCommon, AuditRecordService auditRecordService) { + AppResourceCommon appResourceCommon, AuditRecordService auditRecordService, + AppRegistrationDao appRegistrationDao) { Assert.notNull(appResourceCommon, "'appResourceCommon' must not be null"); Assert.notNull(appRegistrationRepository, "'appRegistrationRepository' must not be null"); Assert.notNull(auditRecordService, "'auditRecordService' must not be null"); + Assert.notNull(appRegistrationDao, "'appRegistrationDao' must not be null"); this.appResourceCommon = appResourceCommon; this.appRegistrationRepository = appRegistrationRepository; this.auditRecordService = auditRecordService; this.auditServiceUtils = new AuditServiceUtils(); + this.appRegistrationDao = appRegistrationDao; } @Override @@ -182,6 +188,13 @@ else if (StringUtils.hasText(name)) { return result; } + @Override + public Page findAllByTypeAndNameIsLikeAndVersionAndDefaultVersion(ApplicationType type, + String name, String version, boolean defaultVersion, Pageable pageable) { + return appRegistrationDao.findAllByTypeAndNameIsLikeAndVersionAndDefaultVersion(type, name, version, + defaultVersion, pageable); + } + @Override public Page findAllByTypeAndNameIsLikeAndDefaultVersionIsTrue(ApplicationType type, String name, Pageable pageable) { Page result = null; diff --git a/spring-cloud-dataflow-registry/src/test/java/org/springframework/cloud/dataflow/registry/service/DefaultAppRegistryServiceTests.java b/spring-cloud-dataflow-registry/src/test/java/org/springframework/cloud/dataflow/registry/service/DefaultAppRegistryServiceTests.java index f2bd076d42..8bfad8c034 100644 --- a/spring-cloud-dataflow-registry/src/test/java/org/springframework/cloud/dataflow/registry/service/DefaultAppRegistryServiceTests.java +++ b/spring-cloud-dataflow-registry/src/test/java/org/springframework/cloud/dataflow/registry/service/DefaultAppRegistryServiceTests.java @@ -29,6 +29,7 @@ import org.springframework.cloud.dataflow.audit.service.DefaultAuditRecordService; import org.springframework.cloud.dataflow.core.AppRegistration; import org.springframework.cloud.dataflow.core.ApplicationType; +import org.springframework.cloud.dataflow.registry.repository.AppRegistrationDao; import org.springframework.cloud.dataflow.registry.repository.AppRegistrationRepository; import org.springframework.cloud.dataflow.registry.support.AppResourceCommon; import org.springframework.cloud.deployer.resource.maven.MavenProperties; @@ -72,7 +73,8 @@ public class DefaultAppRegistryServiceTests { private ResourceLoader resourceLoader = new DefaultResourceLoader(); private AppRegistryService appRegistryService = new DefaultAppRegistryService(appRegistrationRepository, - new AppResourceCommon(new MavenProperties(), resourceLoader), mock(DefaultAuditRecordService.class)); + new AppResourceCommon(new MavenProperties(), resourceLoader), mock(DefaultAuditRecordService.class), + mock(AppRegistrationDao.class)); @Test public void testNotFound() { diff --git a/spring-cloud-dataflow-server-core/src/main/java/org/springframework/cloud/dataflow/server/config/DataFlowControllerAutoConfiguration.java b/spring-cloud-dataflow-server-core/src/main/java/org/springframework/cloud/dataflow/server/config/DataFlowControllerAutoConfiguration.java index 69493297ad..de36227b37 100644 --- a/spring-cloud-dataflow-server-core/src/main/java/org/springframework/cloud/dataflow/server/config/DataFlowControllerAutoConfiguration.java +++ b/spring-cloud-dataflow-server-core/src/main/java/org/springframework/cloud/dataflow/server/config/DataFlowControllerAutoConfiguration.java @@ -45,6 +45,7 @@ import org.springframework.cloud.dataflow.completion.TaskCompletionProvider; import org.springframework.cloud.dataflow.configuration.metadata.ApplicationConfigurationMetadataResolver; import org.springframework.cloud.dataflow.core.StreamDefinitionService; +import org.springframework.cloud.dataflow.registry.repository.AppRegistrationDao; import org.springframework.cloud.dataflow.registry.repository.AppRegistrationRepository; import org.springframework.cloud.dataflow.registry.service.AppRegistryService; import org.springframework.cloud.dataflow.registry.service.DefaultAppRegistryService; @@ -123,6 +124,7 @@ import org.springframework.cloud.skipper.client.SkipperClientResponseErrorHandler; import org.springframework.cloud.task.repository.TaskExplorer; import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Import; import org.springframework.data.jpa.repository.config.EnableJpaAuditing; @@ -227,8 +229,10 @@ public AppResourceCommon appResourceCommon(@Nullable MavenProperties mavenProper @Bean public AppRegistryService appRegistryService(AppRegistrationRepository appRegistrationRepository, - AppResourceCommon appResourceCommon, AuditRecordService auditRecordService) { - return new DefaultAppRegistryService(appRegistrationRepository, appResourceCommon, auditRecordService); + AppResourceCommon appResourceCommon, AuditRecordService auditRecordService, + AppRegistrationDao appRegistrationDao) { + return new DefaultAppRegistryService(appRegistrationRepository, appResourceCommon, auditRecordService, + appRegistrationDao); } @Bean diff --git a/spring-cloud-dataflow-server-core/src/main/java/org/springframework/cloud/dataflow/server/controller/AppRegistryController.java b/spring-cloud-dataflow-server-core/src/main/java/org/springframework/cloud/dataflow/server/controller/AppRegistryController.java index d2c95711ca..0728dcc6e5 100644 --- a/spring-cloud-dataflow-server-core/src/main/java/org/springframework/cloud/dataflow/server/controller/AppRegistryController.java +++ b/spring-cloud-dataflow-server-core/src/main/java/org/springframework/cloud/dataflow/server/controller/AppRegistryController.java @@ -62,6 +62,7 @@ import org.springframework.hateoas.server.RepresentationModelAssembler; import org.springframework.http.HttpStatus; import org.springframework.util.StringUtils; +import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; @@ -128,6 +129,7 @@ public AppRegistryController(Optional streamDefiniti * @param pagedResourcesAssembler the resource assembler for app registrations * @param type the application type: source, sink, processor, task * @param search optional findByTaskNameContains parameter + * @param version optional findByTaskVersionEquals parameter * @return the list of registered applications */ @RequestMapping(method = RequestMethod.GET) @@ -137,12 +139,39 @@ public PagedModel list( PagedResourcesAssembler pagedResourcesAssembler, @RequestParam(value = "type", required = false) ApplicationType type, @RequestParam(required = false) String search, + @RequestParam(required = false) String version, @RequestParam(required = false) boolean defaultVersion) { - Page pagedRegistrations = (defaultVersion) ? - this.appRegistryService.findAllByTypeAndNameIsLikeAndDefaultVersionIsTrue(type, search, pageable) - : this.appRegistryService.findAllByTypeAndNameIsLike(type, search, - pageable); + // Page pagedRegistrations = (defaultVersion) ? + // this.appRegistryService.findAllByTypeAndNameIsLikeAndDefaultVersionIsTrue(type, search, + // pageable) + // : this.appRegistryService.findAllByTypeAndNameIsLike(type, search, + // pageable); + + Page pagedRegistrations = this.appRegistryService + .findAllByTypeAndNameIsLikeAndVersionAndDefaultVersion(type, search, version, defaultVersion, pageable); + + return pagedResourcesAssembler.toModel(pagedRegistrations, this.appRegistryAssembler); + } + + @GetMapping("test") + @ResponseStatus(HttpStatus.OK) + public PagedModel test( + Pageable pageable, + PagedResourcesAssembler pagedResourcesAssembler, + @RequestParam(value = "type", required = false) ApplicationType type, + @RequestParam(required = false) String search, + @RequestParam(required = false) String version, + @RequestParam(required = false) boolean defaultVersion) { + + Page pagedRegistrations = (defaultVersion) ? + this.appRegistryService.findAllByTypeAndNameIsLikeAndDefaultVersionIsTrue(type, search, + pageable) + : this.appRegistryService.findAllByTypeAndNameIsLike(type, search, + pageable); + +// Page pagedRegistrations = this.appRegistryService +// .findAllByTypeAndNameIsLikeAndVersionAndDefaultVersion(type, search, version, defaultVersion, pageable); return pagedResourcesAssembler.toModel(pagedRegistrations, this.appRegistryAssembler); } diff --git a/spring-cloud-dataflow-server-core/src/test/java/org/springframework/cloud/dataflow/server/completion/TabOnTapCompletionProviderTests.java b/spring-cloud-dataflow-server-core/src/test/java/org/springframework/cloud/dataflow/server/completion/TabOnTapCompletionProviderTests.java index 1e36195858..99c0b425de 100644 --- a/spring-cloud-dataflow-server-core/src/test/java/org/springframework/cloud/dataflow/server/completion/TabOnTapCompletionProviderTests.java +++ b/spring-cloud-dataflow-server-core/src/test/java/org/springframework/cloud/dataflow/server/completion/TabOnTapCompletionProviderTests.java @@ -40,6 +40,7 @@ import org.springframework.cloud.dataflow.core.ApplicationType; import org.springframework.cloud.dataflow.core.StreamDefinition; import org.springframework.cloud.dataflow.core.StreamDefinitionService; +import org.springframework.cloud.dataflow.registry.repository.AppRegistrationDao; import org.springframework.cloud.dataflow.registry.repository.AppRegistrationRepository; import org.springframework.cloud.dataflow.registry.service.AppRegistryService; import org.springframework.cloud.dataflow.registry.service.DefaultAppRegistryService; @@ -134,7 +135,7 @@ public AppRegistryService appRegistry() { return new DefaultAppRegistryService(mock(AppRegistrationRepository.class), new AppResourceCommon(new MavenProperties(), new FileSystemResourceLoader()), - mock(DefaultAuditRecordService.class)) { + mock(DefaultAuditRecordService.class), mock(AppRegistrationDao.class)) { @Override public boolean appExist(String name, ApplicationType type) { diff --git a/spring-cloud-dataflow-server-core/src/test/java/org/springframework/cloud/dataflow/server/configuration/JobDependencies.java b/spring-cloud-dataflow-server-core/src/test/java/org/springframework/cloud/dataflow/server/configuration/JobDependencies.java index ba1eee8fa7..0fe8e678aa 100644 --- a/spring-cloud-dataflow-server-core/src/test/java/org/springframework/cloud/dataflow/server/configuration/JobDependencies.java +++ b/spring-cloud-dataflow-server-core/src/test/java/org/springframework/cloud/dataflow/server/configuration/JobDependencies.java @@ -48,6 +48,7 @@ import org.springframework.cloud.dataflow.configuration.metadata.container.ContainerImageMetadataResolver; import org.springframework.cloud.dataflow.core.Launcher; import org.springframework.cloud.dataflow.core.TaskPlatform; +import org.springframework.cloud.dataflow.registry.repository.AppRegistrationDao; import org.springframework.cloud.dataflow.registry.repository.AppRegistrationRepository; import org.springframework.cloud.dataflow.registry.service.AppRegistryService; import org.springframework.cloud.dataflow.registry.service.DefaultAppRegistryService; @@ -382,7 +383,8 @@ public RestControllerAdvice restControllerAdvice() { public AppRegistryService appRegistryService(AppRegistrationRepository appRegistrationRepository, AuditRecordService auditRecordService) { return new DefaultAppRegistryService(appRegistrationRepository, - new AppResourceCommon(new MavenProperties(), new DefaultResourceLoader()), auditRecordService); + new AppResourceCommon(new MavenProperties(), new DefaultResourceLoader()), auditRecordService, + mock(AppRegistrationDao.class)); } @Bean diff --git a/spring-cloud-dataflow-server-core/src/test/java/org/springframework/cloud/dataflow/server/configuration/TestDependencies.java b/spring-cloud-dataflow-server-core/src/test/java/org/springframework/cloud/dataflow/server/configuration/TestDependencies.java index a1f8eba332..a2612b7393 100644 --- a/spring-cloud-dataflow-server-core/src/test/java/org/springframework/cloud/dataflow/server/configuration/TestDependencies.java +++ b/spring-cloud-dataflow-server-core/src/test/java/org/springframework/cloud/dataflow/server/configuration/TestDependencies.java @@ -58,6 +58,7 @@ import org.springframework.cloud.dataflow.core.Launcher; import org.springframework.cloud.dataflow.core.StreamDefinitionService; import org.springframework.cloud.dataflow.core.TaskPlatform; +import org.springframework.cloud.dataflow.registry.repository.AppRegistrationDao; import org.springframework.cloud.dataflow.registry.repository.AppRegistrationRepository; import org.springframework.cloud.dataflow.registry.service.AppRegistryService; import org.springframework.cloud.dataflow.registry.service.DefaultAppRegistryService; @@ -411,7 +412,8 @@ public ToolsController toolsController() { @Bean public AppRegistryService appRegistryService(AppRegistrationRepository appRegistrationRepository, AppResourceCommon appResourceService, AuditRecordService auditRecordService) { - return new DefaultAppRegistryService(appRegistrationRepository, appResourceService, auditRecordService); + return new DefaultAppRegistryService(appRegistrationRepository, appResourceService, auditRecordService, + mock(AppRegistrationDao.class)); } @Bean diff --git a/spring-cloud-dataflow-server/src/main/java/org/springframework/cloud/dataflow/server/single/DataFlowServerApplication.java b/spring-cloud-dataflow-server/src/main/java/org/springframework/cloud/dataflow/server/single/DataFlowServerApplication.java index da79a89e09..e644cf5e41 100644 --- a/spring-cloud-dataflow-server/src/main/java/org/springframework/cloud/dataflow/server/single/DataFlowServerApplication.java +++ b/spring-cloud-dataflow-server/src/main/java/org/springframework/cloud/dataflow/server/single/DataFlowServerApplication.java @@ -22,11 +22,13 @@ import org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration; import org.springframework.boot.autoconfigure.security.servlet.UserDetailsServiceAutoConfiguration; import org.springframework.boot.autoconfigure.session.SessionAutoConfiguration; +import org.springframework.cloud.dataflow.registry.repository.AppRegistrationDao; import org.springframework.cloud.dataflow.server.EnableDataFlowServer; import org.springframework.cloud.deployer.spi.cloudfoundry.CloudFoundryDeployerAutoConfiguration; import org.springframework.cloud.deployer.spi.kubernetes.KubernetesAutoConfiguration; import org.springframework.cloud.deployer.spi.local.LocalDeployerAutoConfiguration; import org.springframework.cloud.task.configuration.MetricsAutoConfiguration; +import org.springframework.context.annotation.ComponentScan; /** * Bootstrap class for the Spring Cloud Data Flow Server. @@ -45,6 +47,7 @@ CloudFoundryDeployerAutoConfiguration.class, KubernetesAutoConfiguration.class }) +@ComponentScan(basePackageClasses = {AppRegistrationDao.class}) @EnableDataFlowServer public class DataFlowServerApplication { From 1533d30c11717a0577950e7f449dc435d82df08e Mon Sep 17 00:00:00 2001 From: siddhantsorann Date: Sat, 23 Jan 2021 17:33:48 +0530 Subject: [PATCH 2/7] fixing test cases --- .../repository/AppRegistrationDao.java | 3 +- .../AppRegistrationRepositoryCustom.java | 72 +++++++++++++++++++ .../CustomAppRegistrationRepository.java | 12 ++++ .../controller/AppRegistryController.java | 30 +------- .../configuration/TestDependencies.java | 7 +- 5 files changed, 93 insertions(+), 31 deletions(-) create mode 100644 spring-cloud-dataflow-registry/src/main/java/org/springframework/cloud/dataflow/registry/repository/AppRegistrationRepositoryCustom.java create mode 100644 spring-cloud-dataflow-registry/src/main/java/org/springframework/cloud/dataflow/registry/repository/CustomAppRegistrationRepository.java diff --git a/spring-cloud-dataflow-registry/src/main/java/org/springframework/cloud/dataflow/registry/repository/AppRegistrationDao.java b/spring-cloud-dataflow-registry/src/main/java/org/springframework/cloud/dataflow/registry/repository/AppRegistrationDao.java index 0678869ada..c5086148c6 100644 --- a/spring-cloud-dataflow-registry/src/main/java/org/springframework/cloud/dataflow/registry/repository/AppRegistrationDao.java +++ b/spring-cloud-dataflow-registry/src/main/java/org/springframework/cloud/dataflow/registry/repository/AppRegistrationDao.java @@ -37,7 +37,7 @@ import org.springframework.util.StringUtils; @Component -public class AppRegistrationDao { +public class AppRegistrationDao implements CustomAppRegistrationRepository { private final EntityManager entityManager; @@ -46,6 +46,7 @@ public AppRegistrationDao(EntityManager entityManager) { this.entityManager = entityManager; } + @Override public Page findAllByTypeAndNameIsLikeAndVersionAndDefaultVersion(ApplicationType type, String name, String version, boolean defaultVersion, Pageable pageable) { CriteriaBuilder cb = entityManager.getCriteriaBuilder(); diff --git a/spring-cloud-dataflow-registry/src/main/java/org/springframework/cloud/dataflow/registry/repository/AppRegistrationRepositoryCustom.java b/spring-cloud-dataflow-registry/src/main/java/org/springframework/cloud/dataflow/registry/repository/AppRegistrationRepositoryCustom.java new file mode 100644 index 0000000000..d9b2f6f55f --- /dev/null +++ b/spring-cloud-dataflow-registry/src/main/java/org/springframework/cloud/dataflow/registry/repository/AppRegistrationRepositoryCustom.java @@ -0,0 +1,72 @@ +package org.springframework.cloud.dataflow.registry.repository; + +import java.util.ArrayList; +import java.util.List; + +import javax.persistence.EntityManager; +import javax.persistence.TypedQuery; +import javax.persistence.criteria.CriteriaBuilder; +import javax.persistence.criteria.CriteriaQuery; +import javax.persistence.criteria.Predicate; +import javax.persistence.criteria.Root; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cloud.dataflow.core.AppRegistration; +import org.springframework.cloud.dataflow.core.ApplicationType; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageImpl; +import org.springframework.data.domain.Pageable; +import org.springframework.data.jpa.repository.query.QueryUtils; +import org.springframework.stereotype.Component; +import org.springframework.util.StringUtils; + +/** + * @author Siddhant Sorann + */ +@Component +public class AppRegistrationRepositoryCustom { + + @Autowired + private EntityManager entityManager; + + public AppRegistrationRepositoryCustom(EntityManager entityManager) { + this.entityManager = entityManager; + } + + public Page findAllByTypeAndNameIsLikeAndVersionAndDefaultVersion(ApplicationType type, + String name, String version, boolean defaultVersion, Pageable pageable) { + CriteriaBuilder cb = entityManager.getCriteriaBuilder(); + CriteriaQuery cq = cb.createQuery(AppRegistration.class); + Root appRegistrationRoot = cq.from(AppRegistration.class); + final List predicates = new ArrayList<>(); + if (type != null) { + predicates.add(cb.equal(appRegistrationRoot.get("type"), type)); + } + if (StringUtils.hasText(name)) { + predicates.add(cb.like(cb.lower(appRegistrationRoot.get("name")), name.toLowerCase())); + } + if (StringUtils.hasText(version)) { + predicates.add(cb.equal(cb.lower(appRegistrationRoot.get("version")), version.toLowerCase())); + } + if (defaultVersion) { + predicates.add(cb.isTrue(appRegistrationRoot.get("defaultVersion"))); + } + cq.where(predicates.toArray(new Predicate[0])); + cq.orderBy(QueryUtils.toOrders(pageable.getSort(), appRegistrationRoot, cb)); + TypedQuery query = entityManager.createQuery(cq); + query.setFirstResult((int) pageable.getOffset()); + query.setMaxResults(pageable.getPageSize()); + final List resultList = query.getResultList(); + return new PageImpl<>(resultList, pageable, getTotalCount(cb, predicates.toArray(new Predicate[0]))); + } + + private Long getTotalCount(CriteriaBuilder criteriaBuilder, Predicate[] predicateArray) { + CriteriaQuery criteriaQuery = criteriaBuilder.createQuery(Long.class); + Root root = criteriaQuery.from(AppRegistration.class); + + criteriaQuery.select(criteriaBuilder.count(root)); + criteriaQuery.where(predicateArray); + + return entityManager.createQuery(criteriaQuery).getSingleResult(); + } +} diff --git a/spring-cloud-dataflow-registry/src/main/java/org/springframework/cloud/dataflow/registry/repository/CustomAppRegistrationRepository.java b/spring-cloud-dataflow-registry/src/main/java/org/springframework/cloud/dataflow/registry/repository/CustomAppRegistrationRepository.java new file mode 100644 index 0000000000..500ecc22c3 --- /dev/null +++ b/spring-cloud-dataflow-registry/src/main/java/org/springframework/cloud/dataflow/registry/repository/CustomAppRegistrationRepository.java @@ -0,0 +1,12 @@ +package org.springframework.cloud.dataflow.registry.repository; + +import org.springframework.cloud.dataflow.core.AppRegistration; +import org.springframework.cloud.dataflow.core.ApplicationType; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; + +public interface CustomAppRegistrationRepository { + public Page findAllByTypeAndNameIsLikeAndVersionAndDefaultVersion( + ApplicationType type, + String name, String version, boolean defaultVersion, Pageable pageable); +} diff --git a/spring-cloud-dataflow-server-core/src/main/java/org/springframework/cloud/dataflow/server/controller/AppRegistryController.java b/spring-cloud-dataflow-server-core/src/main/java/org/springframework/cloud/dataflow/server/controller/AppRegistryController.java index 0728dcc6e5..cfe13cc118 100644 --- a/spring-cloud-dataflow-server-core/src/main/java/org/springframework/cloud/dataflow/server/controller/AppRegistryController.java +++ b/spring-cloud-dataflow-server-core/src/main/java/org/springframework/cloud/dataflow/server/controller/AppRegistryController.java @@ -132,7 +132,7 @@ public AppRegistryController(Optional streamDefiniti * @param version optional findByTaskVersionEquals parameter * @return the list of registered applications */ - @RequestMapping(method = RequestMethod.GET) + @GetMapping @ResponseStatus(HttpStatus.OK) public PagedModel list( Pageable pageable, @@ -142,40 +142,12 @@ public PagedModel list( @RequestParam(required = false) String version, @RequestParam(required = false) boolean defaultVersion) { - // Page pagedRegistrations = (defaultVersion) ? - // this.appRegistryService.findAllByTypeAndNameIsLikeAndDefaultVersionIsTrue(type, search, - // pageable) - // : this.appRegistryService.findAllByTypeAndNameIsLike(type, search, - // pageable); - Page pagedRegistrations = this.appRegistryService .findAllByTypeAndNameIsLikeAndVersionAndDefaultVersion(type, search, version, defaultVersion, pageable); return pagedResourcesAssembler.toModel(pagedRegistrations, this.appRegistryAssembler); } - @GetMapping("test") - @ResponseStatus(HttpStatus.OK) - public PagedModel test( - Pageable pageable, - PagedResourcesAssembler pagedResourcesAssembler, - @RequestParam(value = "type", required = false) ApplicationType type, - @RequestParam(required = false) String search, - @RequestParam(required = false) String version, - @RequestParam(required = false) boolean defaultVersion) { - - Page pagedRegistrations = (defaultVersion) ? - this.appRegistryService.findAllByTypeAndNameIsLikeAndDefaultVersionIsTrue(type, search, - pageable) - : this.appRegistryService.findAllByTypeAndNameIsLike(type, search, - pageable); - -// Page pagedRegistrations = this.appRegistryService -// .findAllByTypeAndNameIsLikeAndVersionAndDefaultVersion(type, search, version, defaultVersion, pageable); - - return pagedResourcesAssembler.toModel(pagedRegistrations, this.appRegistryAssembler); - } - /** * Retrieve detailed information about a particular application. * diff --git a/spring-cloud-dataflow-server-core/src/test/java/org/springframework/cloud/dataflow/server/configuration/TestDependencies.java b/spring-cloud-dataflow-server-core/src/test/java/org/springframework/cloud/dataflow/server/configuration/TestDependencies.java index a2612b7393..a0007e24db 100644 --- a/spring-cloud-dataflow-server-core/src/test/java/org/springframework/cloud/dataflow/server/configuration/TestDependencies.java +++ b/spring-cloud-dataflow-server-core/src/test/java/org/springframework/cloud/dataflow/server/configuration/TestDependencies.java @@ -24,6 +24,7 @@ import java.util.Optional; import java.util.concurrent.ForkJoinPool; +import javax.persistence.EntityManager; import javax.sql.DataSource; import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; @@ -34,6 +35,7 @@ import org.springframework.batch.item.ExecutionContext; import org.springframework.batch.item.database.support.DataFieldMaxValueIncrementerFactory; import org.springframework.batch.item.database.support.DefaultDataFieldMaxValueIncrementerFactory; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.ImportAutoConfiguration; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.boot.autoconfigure.domain.EntityScan; @@ -218,6 +220,9 @@ @EnableTransactionManagement public class TestDependencies extends WebMvcConfigurationSupport { + @Autowired + EntityManager entityManager; + @Bean public RestControllerAdvice restControllerAdvice() { return new RestControllerAdvice(); @@ -413,7 +418,7 @@ public ToolsController toolsController() { public AppRegistryService appRegistryService(AppRegistrationRepository appRegistrationRepository, AppResourceCommon appResourceService, AuditRecordService auditRecordService) { return new DefaultAppRegistryService(appRegistrationRepository, appResourceService, auditRecordService, - mock(AppRegistrationDao.class)); + new AppRegistrationDao(entityManager)); } @Bean From c474ed24e2a57498c07f76bd87fb031f264e3405 Mon Sep 17 00:00:00 2001 From: siddhantsorann Date: Sat, 23 Jan 2021 17:44:41 +0530 Subject: [PATCH 3/7] fixing test cases --- .../repository/AppRegistrationDao.java | 3 +- .../AppRegistrationRepositoryCustom.java | 72 ------------------- .../CustomAppRegistrationRepository.java | 12 ---- 3 files changed, 1 insertion(+), 86 deletions(-) delete mode 100644 spring-cloud-dataflow-registry/src/main/java/org/springframework/cloud/dataflow/registry/repository/AppRegistrationRepositoryCustom.java delete mode 100644 spring-cloud-dataflow-registry/src/main/java/org/springframework/cloud/dataflow/registry/repository/CustomAppRegistrationRepository.java diff --git a/spring-cloud-dataflow-registry/src/main/java/org/springframework/cloud/dataflow/registry/repository/AppRegistrationDao.java b/spring-cloud-dataflow-registry/src/main/java/org/springframework/cloud/dataflow/registry/repository/AppRegistrationDao.java index c5086148c6..0678869ada 100644 --- a/spring-cloud-dataflow-registry/src/main/java/org/springframework/cloud/dataflow/registry/repository/AppRegistrationDao.java +++ b/spring-cloud-dataflow-registry/src/main/java/org/springframework/cloud/dataflow/registry/repository/AppRegistrationDao.java @@ -37,7 +37,7 @@ import org.springframework.util.StringUtils; @Component -public class AppRegistrationDao implements CustomAppRegistrationRepository { +public class AppRegistrationDao { private final EntityManager entityManager; @@ -46,7 +46,6 @@ public AppRegistrationDao(EntityManager entityManager) { this.entityManager = entityManager; } - @Override public Page findAllByTypeAndNameIsLikeAndVersionAndDefaultVersion(ApplicationType type, String name, String version, boolean defaultVersion, Pageable pageable) { CriteriaBuilder cb = entityManager.getCriteriaBuilder(); diff --git a/spring-cloud-dataflow-registry/src/main/java/org/springframework/cloud/dataflow/registry/repository/AppRegistrationRepositoryCustom.java b/spring-cloud-dataflow-registry/src/main/java/org/springframework/cloud/dataflow/registry/repository/AppRegistrationRepositoryCustom.java deleted file mode 100644 index d9b2f6f55f..0000000000 --- a/spring-cloud-dataflow-registry/src/main/java/org/springframework/cloud/dataflow/registry/repository/AppRegistrationRepositoryCustom.java +++ /dev/null @@ -1,72 +0,0 @@ -package org.springframework.cloud.dataflow.registry.repository; - -import java.util.ArrayList; -import java.util.List; - -import javax.persistence.EntityManager; -import javax.persistence.TypedQuery; -import javax.persistence.criteria.CriteriaBuilder; -import javax.persistence.criteria.CriteriaQuery; -import javax.persistence.criteria.Predicate; -import javax.persistence.criteria.Root; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.cloud.dataflow.core.AppRegistration; -import org.springframework.cloud.dataflow.core.ApplicationType; -import org.springframework.data.domain.Page; -import org.springframework.data.domain.PageImpl; -import org.springframework.data.domain.Pageable; -import org.springframework.data.jpa.repository.query.QueryUtils; -import org.springframework.stereotype.Component; -import org.springframework.util.StringUtils; - -/** - * @author Siddhant Sorann - */ -@Component -public class AppRegistrationRepositoryCustom { - - @Autowired - private EntityManager entityManager; - - public AppRegistrationRepositoryCustom(EntityManager entityManager) { - this.entityManager = entityManager; - } - - public Page findAllByTypeAndNameIsLikeAndVersionAndDefaultVersion(ApplicationType type, - String name, String version, boolean defaultVersion, Pageable pageable) { - CriteriaBuilder cb = entityManager.getCriteriaBuilder(); - CriteriaQuery cq = cb.createQuery(AppRegistration.class); - Root appRegistrationRoot = cq.from(AppRegistration.class); - final List predicates = new ArrayList<>(); - if (type != null) { - predicates.add(cb.equal(appRegistrationRoot.get("type"), type)); - } - if (StringUtils.hasText(name)) { - predicates.add(cb.like(cb.lower(appRegistrationRoot.get("name")), name.toLowerCase())); - } - if (StringUtils.hasText(version)) { - predicates.add(cb.equal(cb.lower(appRegistrationRoot.get("version")), version.toLowerCase())); - } - if (defaultVersion) { - predicates.add(cb.isTrue(appRegistrationRoot.get("defaultVersion"))); - } - cq.where(predicates.toArray(new Predicate[0])); - cq.orderBy(QueryUtils.toOrders(pageable.getSort(), appRegistrationRoot, cb)); - TypedQuery query = entityManager.createQuery(cq); - query.setFirstResult((int) pageable.getOffset()); - query.setMaxResults(pageable.getPageSize()); - final List resultList = query.getResultList(); - return new PageImpl<>(resultList, pageable, getTotalCount(cb, predicates.toArray(new Predicate[0]))); - } - - private Long getTotalCount(CriteriaBuilder criteriaBuilder, Predicate[] predicateArray) { - CriteriaQuery criteriaQuery = criteriaBuilder.createQuery(Long.class); - Root root = criteriaQuery.from(AppRegistration.class); - - criteriaQuery.select(criteriaBuilder.count(root)); - criteriaQuery.where(predicateArray); - - return entityManager.createQuery(criteriaQuery).getSingleResult(); - } -} diff --git a/spring-cloud-dataflow-registry/src/main/java/org/springframework/cloud/dataflow/registry/repository/CustomAppRegistrationRepository.java b/spring-cloud-dataflow-registry/src/main/java/org/springframework/cloud/dataflow/registry/repository/CustomAppRegistrationRepository.java deleted file mode 100644 index 500ecc22c3..0000000000 --- a/spring-cloud-dataflow-registry/src/main/java/org/springframework/cloud/dataflow/registry/repository/CustomAppRegistrationRepository.java +++ /dev/null @@ -1,12 +0,0 @@ -package org.springframework.cloud.dataflow.registry.repository; - -import org.springframework.cloud.dataflow.core.AppRegistration; -import org.springframework.cloud.dataflow.core.ApplicationType; -import org.springframework.data.domain.Page; -import org.springframework.data.domain.Pageable; - -public interface CustomAppRegistrationRepository { - public Page findAllByTypeAndNameIsLikeAndVersionAndDefaultVersion( - ApplicationType type, - String name, String version, boolean defaultVersion, Pageable pageable); -} From b6a9c15fd422888d45eab5ff303cccdccf4e0dd2 Mon Sep 17 00:00:00 2001 From: siddhantsorann Date: Sat, 23 Jan 2021 17:56:36 +0530 Subject: [PATCH 4/7] fixing test cases --- .../server/config/DataFlowControllerAutoConfiguration.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spring-cloud-dataflow-server-core/src/main/java/org/springframework/cloud/dataflow/server/config/DataFlowControllerAutoConfiguration.java b/spring-cloud-dataflow-server-core/src/main/java/org/springframework/cloud/dataflow/server/config/DataFlowControllerAutoConfiguration.java index de36227b37..f3287814e4 100644 --- a/spring-cloud-dataflow-server-core/src/main/java/org/springframework/cloud/dataflow/server/config/DataFlowControllerAutoConfiguration.java +++ b/spring-cloud-dataflow-server-core/src/main/java/org/springframework/cloud/dataflow/server/config/DataFlowControllerAutoConfiguration.java @@ -22,6 +22,7 @@ import com.fasterxml.jackson.databind.DeserializationFeature; import com.fasterxml.jackson.databind.ObjectMapper; + import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -124,7 +125,6 @@ import org.springframework.cloud.skipper.client.SkipperClientResponseErrorHandler; import org.springframework.cloud.task.repository.TaskExplorer; import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Import; import org.springframework.data.jpa.repository.config.EnableJpaAuditing; From c9f718ab2a5bddfb3dfa2147c4a591ba8f85359d Mon Sep 17 00:00:00 2001 From: siddhantsorann Date: Mon, 15 Feb 2021 16:53:32 +0530 Subject: [PATCH 5/7] resolving pr issues --- .../server/config/DataFlowControllerAutoConfiguration.java | 1 - 1 file changed, 1 deletion(-) diff --git a/spring-cloud-dataflow-server-core/src/main/java/org/springframework/cloud/dataflow/server/config/DataFlowControllerAutoConfiguration.java b/spring-cloud-dataflow-server-core/src/main/java/org/springframework/cloud/dataflow/server/config/DataFlowControllerAutoConfiguration.java index f3287814e4..6e87393c12 100644 --- a/spring-cloud-dataflow-server-core/src/main/java/org/springframework/cloud/dataflow/server/config/DataFlowControllerAutoConfiguration.java +++ b/spring-cloud-dataflow-server-core/src/main/java/org/springframework/cloud/dataflow/server/config/DataFlowControllerAutoConfiguration.java @@ -22,7 +22,6 @@ import com.fasterxml.jackson.databind.DeserializationFeature; import com.fasterxml.jackson.databind.ObjectMapper; - import org.slf4j.Logger; import org.slf4j.LoggerFactory; From 7040e18e83fa67c6a956d4264844de0c0033d573 Mon Sep 17 00:00:00 2001 From: siddhantsorann Date: Mon, 15 Feb 2021 17:39:30 +0530 Subject: [PATCH 6/7] added test case for filter by version --- .../registry/repository/AppRegistrationDao.java | 2 +- .../controller/AppRegistryControllerTests.java | 17 +++++++++++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/spring-cloud-dataflow-registry/src/main/java/org/springframework/cloud/dataflow/registry/repository/AppRegistrationDao.java b/spring-cloud-dataflow-registry/src/main/java/org/springframework/cloud/dataflow/registry/repository/AppRegistrationDao.java index 0678869ada..ba9f28b982 100644 --- a/spring-cloud-dataflow-registry/src/main/java/org/springframework/cloud/dataflow/registry/repository/AppRegistrationDao.java +++ b/spring-cloud-dataflow-registry/src/main/java/org/springframework/cloud/dataflow/registry/repository/AppRegistrationDao.java @@ -56,7 +56,7 @@ public Page findAllByTypeAndNameIsLikeAndVersionAndDefaultVersi predicates.add(cb.equal(appRegistrationRoot.get("type"), type)); } if (StringUtils.hasText(name)) { - predicates.add(cb.like(cb.lower(appRegistrationRoot.get("name")), name.toLowerCase())); + predicates.add(cb.like(cb.lower(appRegistrationRoot.get("name")), "%" + name.toLowerCase() + "%")); } if (StringUtils.hasText(version)) { predicates.add(cb.equal(cb.lower(appRegistrationRoot.get("version")), version.toLowerCase())); diff --git a/spring-cloud-dataflow-server-core/src/test/java/org/springframework/cloud/dataflow/server/controller/AppRegistryControllerTests.java b/spring-cloud-dataflow-server-core/src/test/java/org/springframework/cloud/dataflow/server/controller/AppRegistryControllerTests.java index 5fdca8b33b..ec1b33a306 100644 --- a/spring-cloud-dataflow-server-core/src/test/java/org/springframework/cloud/dataflow/server/controller/AppRegistryControllerTests.java +++ b/spring-cloud-dataflow-server-core/src/test/java/org/springframework/cloud/dataflow/server/controller/AppRegistryControllerTests.java @@ -328,6 +328,23 @@ public void testListApplicationsBySearch() throws Exception { .andExpect(jsonPath("content", hasSize(2))); } + @Test + public void testListApplicationsByVersion() throws Exception { + mockMvc.perform(get("/apps?version=1.0.0.BUILD-SNAPSHOT").accept(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()) + .andExpect(jsonPath("content", hasSize(4))); + } + + @Test + public void testListApplicationsByVersionAndSearch() throws Exception { + mockMvc.perform(get("/apps?version=1.0.0.BUILD-SNAPSHOT&search=time").accept(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()) + .andExpect(jsonPath("content", hasSize(2))); + mockMvc.perform(get("/apps?version=1.0.0.BUILD-SNAPSHOT&search=timestamp").accept(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()) + .andExpect(jsonPath("content", hasSize(1))); + } + @Test public void testListApplicationsByTypeAndSearch() throws Exception { mockMvc.perform(get("/apps?type=task&search=time").accept(MediaType.APPLICATION_JSON)).andExpect(status().isOk()) From f33fb5de86a781630dcedb7ab0227708cb616233 Mon Sep 17 00:00:00 2001 From: siddhantsorann Date: Tue, 16 Feb 2021 14:25:56 +0530 Subject: [PATCH 7/7] fixed failing test cases --- .../registry/repository/AppRegistrationDao.java | 15 ++++++++++++++- .../repository/AppRegistrationRepository.java | 2 ++ .../server/configuration/TestDependencies.java | 2 +- 3 files changed, 17 insertions(+), 2 deletions(-) diff --git a/spring-cloud-dataflow-registry/src/main/java/org/springframework/cloud/dataflow/registry/repository/AppRegistrationDao.java b/spring-cloud-dataflow-registry/src/main/java/org/springframework/cloud/dataflow/registry/repository/AppRegistrationDao.java index ba9f28b982..03a9991ada 100644 --- a/spring-cloud-dataflow-registry/src/main/java/org/springframework/cloud/dataflow/registry/repository/AppRegistrationDao.java +++ b/spring-cloud-dataflow-registry/src/main/java/org/springframework/cloud/dataflow/registry/repository/AppRegistrationDao.java @@ -17,7 +17,9 @@ package org.springframework.cloud.dataflow.registry.repository; import java.util.ArrayList; +import java.util.HashSet; import java.util.List; +import java.util.stream.Collectors; import javax.persistence.EntityManager; import javax.persistence.TypedQuery; @@ -40,10 +42,13 @@ public class AppRegistrationDao { private final EntityManager entityManager; + private final AppRegistrationRepository appRegistrationRepository; - public AppRegistrationDao(EntityManager entityManager) { + public AppRegistrationDao(EntityManager entityManager, AppRegistrationRepository appRegistrationRepository) { Assert.notNull(entityManager, "Entity manager cannot be null"); + Assert.notNull(appRegistrationRepository, "AppRegistrationRepository cannot be null"); this.entityManager = entityManager; + this.appRegistrationRepository = appRegistrationRepository; } public Page findAllByTypeAndNameIsLikeAndVersionAndDefaultVersion(ApplicationType type, @@ -70,6 +75,14 @@ public Page findAllByTypeAndNameIsLikeAndVersionAndDefaultVersi query.setFirstResult((int) pageable.getOffset()); query.setMaxResults(pageable.getPageSize()); final List resultList = query.getResultList(); + if (defaultVersion) { + resultList.forEach(appRegistration -> { + HashSet versions = + appRegistrationRepository.findAllByName(appRegistration.getName()).stream() + .map(AppRegistration::getVersion).collect(Collectors.toCollection(HashSet::new)); + appRegistration.setVersions(versions); + }); + } return new PageImpl<>(resultList, pageable, getTotalCount(cb, predicates.toArray(new Predicate[0]))); } diff --git a/spring-cloud-dataflow-registry/src/main/java/org/springframework/cloud/dataflow/registry/repository/AppRegistrationRepository.java b/spring-cloud-dataflow-registry/src/main/java/org/springframework/cloud/dataflow/registry/repository/AppRegistrationRepository.java index 8e09070d04..08c8a06e4c 100644 --- a/spring-cloud-dataflow-registry/src/main/java/org/springframework/cloud/dataflow/registry/repository/AppRegistrationRepository.java +++ b/spring-cloud-dataflow-registry/src/main/java/org/springframework/cloud/dataflow/registry/repository/AppRegistrationRepository.java @@ -52,6 +52,8 @@ public interface AppRegistrationRepository extends KeyValueRepository findAllByNameContainingIgnoreCaseAndDefaultVersionIsTrue(String name, Pageable pageable); + List findAllByName(String name); + @Override S save(S s); diff --git a/spring-cloud-dataflow-server-core/src/test/java/org/springframework/cloud/dataflow/server/configuration/TestDependencies.java b/spring-cloud-dataflow-server-core/src/test/java/org/springframework/cloud/dataflow/server/configuration/TestDependencies.java index a0007e24db..cda63341c6 100644 --- a/spring-cloud-dataflow-server-core/src/test/java/org/springframework/cloud/dataflow/server/configuration/TestDependencies.java +++ b/spring-cloud-dataflow-server-core/src/test/java/org/springframework/cloud/dataflow/server/configuration/TestDependencies.java @@ -418,7 +418,7 @@ public ToolsController toolsController() { public AppRegistryService appRegistryService(AppRegistrationRepository appRegistrationRepository, AppResourceCommon appResourceService, AuditRecordService auditRecordService) { return new DefaultAppRegistryService(appRegistrationRepository, appResourceService, auditRecordService, - new AppRegistrationDao(entityManager)); + new AppRegistrationDao(entityManager, appRegistrationRepository)); } @Bean