From f90de4c84bb8c83efcb9928b2f11992e65d0e553 Mon Sep 17 00:00:00 2001 From: Nieraj Singh Date: Thu, 8 Oct 2020 15:46:02 -0700 Subject: [PATCH] PT 173730396 - Initial implementation of generations validation Includes parsing of spring boot projects from spring.io/api, as well as spring boot project generations from sample code, and relevant junits. --- .../generations/SpringProjectIndex.java | 66 ++++++++ .../generations/SpringProjectsClient.java | 65 ++++++++ .../generations/json/Generation.java | 52 +++++++ .../generations/json/Generations.java | 26 ++++ .../generations/json/GenerationsEmbedded.java | 25 +++ .../generations/json/JsonHalEmbedded.java | 18 +++ .../generations/json/JsonHalLinks.java | 24 +++ .../generations/json/JsonHalParser.java | 25 +++ .../validation/generations/json/Link.java | 24 +++ .../validation/generations/json/Links.java | 60 ++++++++ .../generations/json/SpringProject.java | 51 +++++++ .../generations/json/SpringProjects.java | 25 +++ .../json/SpringProjectsEmbedded.java | 24 +++ .../ProjectGenerationsValidationTest.java | 144 ++++++++++++++++++ .../test/SpringProjectsTestSamples.java | 52 +++++++ 15 files changed, 681 insertions(+) create mode 100644 headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/validation/generations/SpringProjectIndex.java create mode 100644 headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/validation/generations/SpringProjectsClient.java create mode 100644 headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/validation/generations/json/Generation.java create mode 100644 headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/validation/generations/json/Generations.java create mode 100644 headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/validation/generations/json/GenerationsEmbedded.java create mode 100644 headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/validation/generations/json/JsonHalEmbedded.java create mode 100644 headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/validation/generations/json/JsonHalLinks.java create mode 100644 headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/validation/generations/json/JsonHalParser.java create mode 100644 headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/validation/generations/json/Link.java create mode 100644 headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/validation/generations/json/Links.java create mode 100644 headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/validation/generations/json/SpringProject.java create mode 100644 headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/validation/generations/json/SpringProjects.java create mode 100644 headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/validation/generations/json/SpringProjectsEmbedded.java create mode 100644 headless-services/spring-boot-language-server/src/test/java/org/springframework/ide/vscode/boot/validation/test/ProjectGenerationsValidationTest.java create mode 100644 headless-services/spring-boot-language-server/src/test/java/org/springframework/ide/vscode/boot/validation/test/SpringProjectsTestSamples.java diff --git a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/validation/generations/SpringProjectIndex.java b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/validation/generations/SpringProjectIndex.java new file mode 100644 index 000000000..3e096e40a --- /dev/null +++ b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/validation/generations/SpringProjectIndex.java @@ -0,0 +1,66 @@ +/******************************************************************************* + * Copyright (c) 2020 Pivotal, Inc. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * https://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Pivotal, Inc. - initial API and implementation + *******************************************************************************/ +package org.springframework.ide.vscode.boot.validation.generations; + +import java.util.List; + +import org.springframework.ide.vscode.boot.validation.generations.json.Generations; +import org.springframework.ide.vscode.boot.validation.generations.json.Link; +import org.springframework.ide.vscode.boot.validation.generations.json.Links; +import org.springframework.ide.vscode.boot.validation.generations.json.SpringProject; +import org.springframework.ide.vscode.boot.validation.generations.json.SpringProjects; + +public class SpringProjectIndex { + + private final SpringProjectsClient client; + + public SpringProjectIndex(SpringProjectsClient client) { + this.client = client; + } + + public SpringProjects getProjects() throws Exception { + return client.getSpringProjects(); + } + + public Generations getGenerations(SpringProject project) throws Exception { + if (project != null) { + Links _links = project.get_links(); + if (_links != null) { + Link genLink = _links.getGenerations(); + if (genLink != null) { + return client.getGenerations(genLink.getHref()); + } + } + } + return null; + } + + /** + * + * @param projectSlug slug used by Spring projects metadata, for example + * "spring-boot" for Spring Boot projects + * @return + * @throws Exception + */ + public SpringProject getProject(String projectSlug) throws Exception { + SpringProjects springProjects = getProjects(); + List projects = springProjects.getProjects(); + SpringProject prj = null; + for (SpringProject project : projects) { + if (project.getSlug().equals(projectSlug)) { + prj = project; + break; + } + } + return prj; + } + +} diff --git a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/validation/generations/SpringProjectsClient.java b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/validation/generations/SpringProjectsClient.java new file mode 100644 index 000000000..94cbd6340 --- /dev/null +++ b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/validation/generations/SpringProjectsClient.java @@ -0,0 +1,65 @@ +/******************************************************************************* + * Copyright (c) 2020 Pivotal, Inc. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * https://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Pivotal, Inc. - initial API and implementation + *******************************************************************************/ +package org.springframework.ide.vscode.boot.validation.generations; + +import org.springframework.http.HttpEntity; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpMethod; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.ide.vscode.boot.validation.generations.json.Generations; +import org.springframework.ide.vscode.boot.validation.generations.json.GenerationsEmbedded; +import org.springframework.ide.vscode.boot.validation.generations.json.JsonHalEmbedded; +import org.springframework.ide.vscode.boot.validation.generations.json.SpringProjects; +import org.springframework.ide.vscode.boot.validation.generations.json.SpringProjectsEmbedded; +import org.springframework.web.client.RestTemplate; + +public class SpringProjectsClient { + + private final String url; + + public SpringProjectsClient(String url) { + this.url = url; + } + + public SpringProjects getSpringProjects() throws Exception { + return getEmbedded(url, SpringProjectsEmbedded.class); + } + + public Generations getGenerations(String generationsUrl) throws Exception { + return getEmbedded(generationsUrl, GenerationsEmbedded.class); + } + + private T getEmbedded(String url, Class> clazz) throws Exception { + if (url != null) { + JsonHalEmbedded embedded = get(url, clazz); + if (embedded != null) { + return embedded.get_embedded(); + } + } + return null; + } + + private T get(String url, Class clazz) throws Exception { + HttpHeaders headers = new HttpHeaders(); + + headers.setAccept(MediaType.parseMediaTypes("application/hal+json")); + + @SuppressWarnings({ "rawtypes", "unchecked" }) + HttpEntity entity = new HttpEntity(headers); + + RestTemplate restTemplate = new RestTemplate(); + ResponseEntity response = restTemplate.exchange(url, HttpMethod.GET, entity, clazz); + + return response.getBody(); + } + +} diff --git a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/validation/generations/json/Generation.java b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/validation/generations/json/Generation.java new file mode 100644 index 000000000..3b92c486a --- /dev/null +++ b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/validation/generations/json/Generation.java @@ -0,0 +1,52 @@ +/******************************************************************************* + * Copyright (c) 2020 Pivotal, Inc. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * https://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Pivotal, Inc. - initial API and implementation + *******************************************************************************/ +package org.springframework.ide.vscode.boot.validation.generations.json; + +public class Generation extends JsonHalLinks { + + private String name; + private String ossSupportEndDate; + private String commercialSupportEndDate; + private String initialReleaseDate; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getOssSupportEndDate() { + return ossSupportEndDate; + } + + public void setOssSupportEndDate(String ossSupportEndDate) { + this.ossSupportEndDate = ossSupportEndDate; + } + + public String getCommercialSupportEndDate() { + return commercialSupportEndDate; + } + + public void setCommercialSupportEndDate(String commercialSupportEndDate) { + this.commercialSupportEndDate = commercialSupportEndDate; + } + + public String getInitialReleaseDate() { + return initialReleaseDate; + } + + public void setInitialReleaseDate(String initialReleaseDate) { + this.initialReleaseDate = initialReleaseDate; + } + +} diff --git a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/validation/generations/json/Generations.java b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/validation/generations/json/Generations.java new file mode 100644 index 000000000..7bf560bc1 --- /dev/null +++ b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/validation/generations/json/Generations.java @@ -0,0 +1,26 @@ +/******************************************************************************* + * Copyright (c) 2020 Pivotal, Inc. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * https://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Pivotal, Inc. - initial API and implementation + *******************************************************************************/ +package org.springframework.ide.vscode.boot.validation.generations.json; + +import java.util.List; + +public class Generations { + + private List generations; + + public List getGenerations() { + return generations; + } + + public void setGenerations(List generations) { + this.generations = generations; + } +} \ No newline at end of file diff --git a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/validation/generations/json/GenerationsEmbedded.java b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/validation/generations/json/GenerationsEmbedded.java new file mode 100644 index 000000000..9679fc075 --- /dev/null +++ b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/validation/generations/json/GenerationsEmbedded.java @@ -0,0 +1,25 @@ +/******************************************************************************* + * Copyright (c) 2020 Pivotal, Inc. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * https://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Pivotal, Inc. - initial API and implementation + *******************************************************************************/ +package org.springframework.ide.vscode.boot.validation.generations.json; + +public class GenerationsEmbedded extends JsonHalLinks implements JsonHalEmbedded { + + + private Generations _embedded; + + public Generations get_embedded() { + return _embedded; + } + + public void set_embedded(Generations _embedded) { + this._embedded = _embedded; + } +} diff --git a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/validation/generations/json/JsonHalEmbedded.java b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/validation/generations/json/JsonHalEmbedded.java new file mode 100644 index 000000000..29dd01992 --- /dev/null +++ b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/validation/generations/json/JsonHalEmbedded.java @@ -0,0 +1,18 @@ +/******************************************************************************* + * Copyright (c) 2020 Pivotal, Inc. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * https://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Pivotal, Inc. - initial API and implementation + *******************************************************************************/ +package org.springframework.ide.vscode.boot.validation.generations.json; + +public interface JsonHalEmbedded { + + T get_embedded(); + + void set_embedded(T _embedded); +} diff --git a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/validation/generations/json/JsonHalLinks.java b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/validation/generations/json/JsonHalLinks.java new file mode 100644 index 000000000..d41f94fea --- /dev/null +++ b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/validation/generations/json/JsonHalLinks.java @@ -0,0 +1,24 @@ +/******************************************************************************* + * Copyright (c) 2020 Pivotal, Inc. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * https://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Pivotal, Inc. - initial API and implementation + *******************************************************************************/ +package org.springframework.ide.vscode.boot.validation.generations.json; + +public class JsonHalLinks { + + private Links _links; + + public Links get_links() { + return _links; + } + + public void set_links(Links _links) { + this._links = _links; + } +} diff --git a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/validation/generations/json/JsonHalParser.java b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/validation/generations/json/JsonHalParser.java new file mode 100644 index 000000000..26433a32f --- /dev/null +++ b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/validation/generations/json/JsonHalParser.java @@ -0,0 +1,25 @@ +/******************************************************************************* + * Copyright (c) 2020 Pivotal, Inc. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * https://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Pivotal, Inc. - initial API and implementation + *******************************************************************************/ +package org.springframework.ide.vscode.boot.validation.generations.json; + +import com.google.gson.Gson; + +public class JsonHalParser { + + public T getEmbedded(String json, Class> clazz) throws Exception { + if (json != null) { + Gson gson = new Gson(); + JsonHalEmbedded embedded = gson.fromJson(json, clazz); + return embedded.get_embedded(); + } + return null; + } +} diff --git a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/validation/generations/json/Link.java b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/validation/generations/json/Link.java new file mode 100644 index 000000000..abfbde5de --- /dev/null +++ b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/validation/generations/json/Link.java @@ -0,0 +1,24 @@ +/******************************************************************************* + * Copyright (c) 2020 Pivotal, Inc. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * https://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Pivotal, Inc. - initial API and implementation + *******************************************************************************/ +package org.springframework.ide.vscode.boot.validation.generations.json; + +public class Link { + + private String href; + + public void setHref(String href) { + this.href = href; + } + + public String getHref() { + return this.href; + } +} diff --git a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/validation/generations/json/Links.java b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/validation/generations/json/Links.java new file mode 100644 index 000000000..8cb988a92 --- /dev/null +++ b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/validation/generations/json/Links.java @@ -0,0 +1,60 @@ +/******************************************************************************* + * Copyright (c) 2020 Pivotal, Inc. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * https://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Pivotal, Inc. - initial API and implementation + *******************************************************************************/ +package org.springframework.ide.vscode.boot.validation.generations.json; + +public class Links { + + private Link self; + private Link releases; + private Link generations; + private Link parent; + private Link project; + + public Link getSelf() { + return self; + } + + public void setSelf(Link self) { + this.self = self; + } + + public Link getReleases() { + return releases; + } + + public void setReleases(Link releases) { + this.releases = releases; + } + + public Link getGenerations() { + return generations; + } + + public void setGenerations(Link generations) { + this.generations = generations; + } + + public Link getParent() { + return parent; + } + + public void setParent(Link parent) { + this.parent = parent; + } + + public Link getProject() { + return project; + } + + public void setProject(Link project) { + this.project = project; + } +} diff --git a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/validation/generations/json/SpringProject.java b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/validation/generations/json/SpringProject.java new file mode 100644 index 000000000..17320493a --- /dev/null +++ b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/validation/generations/json/SpringProject.java @@ -0,0 +1,51 @@ +/******************************************************************************* + * Copyright (c) 2020 Pivotal, Inc. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * https://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Pivotal, Inc. - initial API and implementation + *******************************************************************************/ +package org.springframework.ide.vscode.boot.validation.generations.json; + +public class SpringProject extends JsonHalLinks { + + private String name; + private String slug; + private String status; + private String repositoryUrl; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getSlug() { + return slug; + } + + public void setSlug(String slug) { + this.slug = slug; + } + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } + + public String getRepositoryUrl() { + return repositoryUrl; + } + + public void setRepositoryUrl(String repositoryUrl) { + this.repositoryUrl = repositoryUrl; + } +} diff --git a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/validation/generations/json/SpringProjects.java b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/validation/generations/json/SpringProjects.java new file mode 100644 index 000000000..f16d0e9f6 --- /dev/null +++ b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/validation/generations/json/SpringProjects.java @@ -0,0 +1,25 @@ +/******************************************************************************* + * Copyright (c) 2020 Pivotal, Inc. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * https://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Pivotal, Inc. - initial API and implementation + *******************************************************************************/ +package org.springframework.ide.vscode.boot.validation.generations.json; + +import java.util.List; + +public class SpringProjects { + private List projects; + + public List getProjects() { + return projects; + } + + public void setProjects(List projects) { + this.projects = projects; + } +} \ No newline at end of file diff --git a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/validation/generations/json/SpringProjectsEmbedded.java b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/validation/generations/json/SpringProjectsEmbedded.java new file mode 100644 index 000000000..f6950fc3d --- /dev/null +++ b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/validation/generations/json/SpringProjectsEmbedded.java @@ -0,0 +1,24 @@ +/******************************************************************************* + * Copyright (c) 2020 Pivotal, Inc. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * https://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Pivotal, Inc. - initial API and implementation + *******************************************************************************/ +package org.springframework.ide.vscode.boot.validation.generations.json; + +public class SpringProjectsEmbedded extends JsonHalLinks implements JsonHalEmbedded { + + private SpringProjects _embedded; + + public SpringProjects get_embedded() { + return _embedded; + } + + public void set_embedded(SpringProjects _embedded) { + this._embedded = _embedded; + } +} diff --git a/headless-services/spring-boot-language-server/src/test/java/org/springframework/ide/vscode/boot/validation/test/ProjectGenerationsValidationTest.java b/headless-services/spring-boot-language-server/src/test/java/org/springframework/ide/vscode/boot/validation/test/ProjectGenerationsValidationTest.java new file mode 100644 index 000000000..25ad7b3de --- /dev/null +++ b/headless-services/spring-boot-language-server/src/test/java/org/springframework/ide/vscode/boot/validation/test/ProjectGenerationsValidationTest.java @@ -0,0 +1,144 @@ +/******************************************************************************* + * Copyright (c) 2020 Pivotal, Inc. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * https://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Pivotal, Inc. - initial API and implementation + *******************************************************************************/ +package org.springframework.ide.vscode.boot.validation.test; + +import static org.junit.Assert.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import java.util.List; + +import org.junit.Before; +import org.junit.Test; +import org.springframework.ide.vscode.boot.validation.generations.SpringProjectIndex; +import org.springframework.ide.vscode.boot.validation.generations.SpringProjectsClient; +import org.springframework.ide.vscode.boot.validation.generations.json.Generation; +import org.springframework.ide.vscode.boot.validation.generations.json.Generations; +import org.springframework.ide.vscode.boot.validation.generations.json.GenerationsEmbedded; +import org.springframework.ide.vscode.boot.validation.generations.json.JsonHalParser; +import org.springframework.ide.vscode.boot.validation.generations.json.Link; +import org.springframework.ide.vscode.boot.validation.generations.json.SpringProject; +import org.springframework.ide.vscode.boot.validation.generations.json.SpringProjects; +import org.springframework.ide.vscode.boot.validation.generations.json.SpringProjectsEmbedded; + +public class ProjectGenerationsValidationTest { + + @Before + public void setup() throws Exception { + + } + + @Test + public void testProjectsInfoFromSpringIo() throws Exception { + String url = "https://spring.io/api/projects"; + SpringProjectsClient client = new SpringProjectsClient(url); + SpringProjectIndex projectIndex = new SpringProjectIndex(client); + + SpringProjects springProjects = projectIndex.getProjects(); + assertNotNull(springProjects); + assertTrue(!springProjects.getProjects().isEmpty()); + + SpringProject project = projectIndex.getProject("spring-boot"); + assertNotNull(project); + assertEquals("Spring Boot", project.getName()); + assertEquals("spring-boot", project.getSlug()); + + project = projectIndex.getProject("spring-integration"); + assertNotNull(project); + assertEquals("Spring Integration", project.getName()); + assertEquals("spring-integration", project.getSlug()); + } + + @Test + public void testGenerationsFromSpringIo() throws Exception { + String url = "https://spring.io/api/projects"; + SpringProjectsClient client = new SpringProjectsClient(url); + SpringProjectIndex projectIndex = new SpringProjectIndex(client); + + SpringProject project = projectIndex.getProject("spring-boot"); + assertNotNull(project); + Link generationsUrl = project.get_links().getGenerations(); + assertNotNull(generationsUrl); + assertEquals("https://spring.io/api/projects/spring-boot/generations", generationsUrl.getHref()); + + Generations generations = projectIndex.getGenerations(project); + + // NOTE: at the moment Generations are not available from spring.io API. Enable + // when they are +// assertNotNull(generations); + } + + @Test + public void testGenerationsFromSample() throws Exception { + SpringProjectsClient client = getMockClient(); + + SpringProjectIndex projectIndex = new SpringProjectIndex(client); + + SpringProject project = projectIndex.getProject("spring-boot"); + assertNotNull(project); + + Generations generations = projectIndex.getGenerations(project); + assertNotNull(generations); + + List genList = generations.getGenerations(); + + assertNotNull(genList); + assertTrue(genList.size() > 0); + + Generation generation = genList.get(0); + assertEquals("2.1.x", generation.getName()); + assertEquals("2019-01-01", generation.getInitialReleaseDate()); + assertEquals("2020-01-01", generation.getOssSupportEndDate()); + assertEquals("2021-01-01", generation.getCommercialSupportEndDate()); + } + + /* + * + * + * Helper methods + * + * + * + */ + + protected SpringProjectsClient getMockClient() throws Exception { + return new SpringProjectsClient(null) { + + @Override + public SpringProjects getSpringProjects() throws Exception { + return getProjectsFromSampleJson(); + } + + @Override + public Generations getGenerations(String generationsUrl) throws Exception { + return getGenerationsFromSampleJson(generationsUrl); + } + }; + } + + protected SpringProjects getProjectsFromSampleJson() throws Exception { + JsonHalParser parser = new JsonHalParser(); + return parser.getEmbedded(SpringProjectsTestSamples.SPRING_PROJECTS_JSON_SAMPLE, SpringProjectsEmbedded.class); + } + + protected Generations getGenerationsFromSampleJson(String genUrl) throws Exception { + String json = null; + if ("https://spring.io/api/projects/spring-boot/generations".equals(genUrl)) { + json = SpringProjectsTestSamples.SPRING_BOOT_PROJECT_GENERATIONS; + } + + if (json != null) { + JsonHalParser parser = new JsonHalParser(); + return parser.getEmbedded(json, GenerationsEmbedded.class); + } + return null; + } +} diff --git a/headless-services/spring-boot-language-server/src/test/java/org/springframework/ide/vscode/boot/validation/test/SpringProjectsTestSamples.java b/headless-services/spring-boot-language-server/src/test/java/org/springframework/ide/vscode/boot/validation/test/SpringProjectsTestSamples.java new file mode 100644 index 000000000..2644d0ac1 --- /dev/null +++ b/headless-services/spring-boot-language-server/src/test/java/org/springframework/ide/vscode/boot/validation/test/SpringProjectsTestSamples.java @@ -0,0 +1,52 @@ +package org.springframework.ide.vscode.boot.validation.test; + +public class SpringProjectsTestSamples { + + public static final String SPRING_BOOT_PROJECT_GENERATIONS = "{\n" + " \"_embedded\" : {\n" + + " \"generations\" : [ {\n" + " \"name\" : \"2.1.x\",\n" + + " \"initialReleaseDate\" : \"2019-01-01\",\n" + " \"ossSupportEndDate\" : \"2020-01-01\",\n" + + " \"commercialSupportEndDate\" : \"2021-01-01\",\n" + " \"_links\" : {\n" + + " \"self\" : {\n" + + " \"href\" : \"https://spring.io/api/projects/spring-boot/generations/2.1.x\"\n" + " },\n" + + " \"project\" : {\n" + " \"href\" : \"https://spring.io/api/projects/spring-boot\"\n" + + " }\n" + " }\n" + " }, {\n" + " \"name\" : \"2.2.x\",\n" + + " \"initialReleaseDate\" : \"2020-01-01\",\n" + " \"ossSupportEndDate\" : \"2021-01-01\",\n" + + " \"commercialSupportEndDate\" : \"2022-01-01\",\n" + " \"_links\" : {\n" + + " \"self\" : {\n" + + " \"href\" : \"https://spring.io/api/projects/spring-boot/generations/2.2.x\"\n" + " },\n" + + " \"project\" : {\n" + " \"href\" : \"https://spring.io/api/projects/spring-boot\"\n" + + " }\n" + " }\n" + " } ]\n" + " },\n" + " \"_links\" : {\n" + " \"project\" : {\n" + + " \"href\" : \"https://spring.io/api/projects/spring-boot\"\n" + " }\n" + " }\n" + "}"; + + + public static final String SPRING_PROJECTS_JSON_SAMPLE = "{\n" + " \"_embedded\" : {\n" + + " \"projects\" : [ {\n" + " \"name\" : \"Spring Boot\",\n" + " \"slug\" : \"spring-boot\",\n" + + " \"repositoryUrl\" : \"https://github.com/spring-projects/spring-boot\",\n" + + " \"status\" : \"ACTIVE\",\n" + " \"_links\" : {\n" + " \"self\" : {\n" + + " \"href\" : \"https://spring.io/api/projects/spring-boot\"\n" + " },\n" + + " \"releases\" : {\n" + + " \"href\" : \"https://spring.io/api/projects/spring-boot/releases\"\n" + " },\n" + + " \"generations\" : {\n" + + " \"href\" : \"https://spring.io/api/projects/spring-boot/generations\"\n" + " }\n" + + " }\n" + " }, {\n" + " \"name\" : \"Spring Data\",\n" + " \"slug\" : \"spring-data\",\n" + + " \"repositoryUrl\" : \"https://github.com/spring-projects/spring-data\",\n" + + " \"status\" : \"ACTIVE\",\n" + " \"_links\" : {\n" + " \"self\" : {\n" + + " \"href\" : \"https://spring.io/api/projects/spring-data\"\n" + " },\n" + + " \"releases\" : {\n" + + " \"href\" : \"https://spring.io/api/projects/spring-data/releases\"\n" + " },\n" + + " \"generations\" : {\n" + + " \"href\" : \"https://spring.io/api/projects/spring-data/generations\"\n" + " }\n" + + " }\n" + " }, {\n" + " \"name\" : \"Spring Data Elasticsearch\",\n" + + " \"slug\" : \"spring-data-elasticsearch\",\n" + + " \"repositoryUrl\" : \"https://github.com/spring-projects/spring-data-elasticsearch\",\n" + + " \"status\" : \"ACTIVE\",\n" + " \"_links\" : {\n" + " \"self\" : {\n" + + " \"href\" : \"https://spring.io/api/projects/spring-data-elasticsearch\"\n" + " },\n" + + " \"releases\" : {\n" + + " \"href\" : \"https://spring.io/api/projects/spring-data-elasticsearch/releases\"\n" + + " },\n" + " \"generations\" : {\n" + + " \"href\" : \"https://spring.io/api/projects/spring-data-elasticsearch/generations\"\n" + + " },\n" + " \"parent\" : {\n" + + " \"href\" : \"https://spring.io/api/projects/spring-data\"\n" + " }\n" + " }\n" + + " } ]\n" + " }\n" + "}"; + +}