Skip to content

Commit

Permalink
Switch project structure to use the new generator
Browse files Browse the repository at this point in the history
This commit removes the former `ProjectGenerator` api based on mustache
template in favour of a new DSL infrastructure to be detailed in further
commits.

Event handling is now web-specific with a `ProjectRequest` and a
`WebProjectRequest` that gathers the base input from the request and
some additional web-specific metadata, respectively. As a consequence
the `initializr-actuator` module has now a dependency on the
`initializr-web` module.

See spring-iogh-340

Co-authored-by: Stephane Nicoll <[email protected]>
mbhave and snicoll committed Feb 8, 2019
1 parent 0628829 commit e281480
Showing 129 changed files with 1,153 additions and 8,245 deletions.
1 change: 0 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
@@ -13,7 +13,6 @@
.factorypath
*.iml
bin
build
target
.springBeans
.vscode/
10 changes: 4 additions & 6 deletions initializr-actuator/pom.xml
Original file line number Diff line number Diff line change
@@ -19,7 +19,10 @@
<groupId>io.spring.initializr</groupId>
<artifactId>initializr-generator</artifactId>
</dependency>

<dependency>
<groupId>io.spring.initializr</groupId>
<artifactId>initializr-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-autoconfigure</artifactId>
@@ -75,11 +78,6 @@
<type>test-jar</type>
<scope>test</scope>
</dependency>
<dependency>
<groupId>io.spring.initializr</groupId>
<artifactId>initializr-web</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>io.spring.initializr</groupId>
<artifactId>initializr-web</artifactId>
Original file line number Diff line number Diff line change
@@ -23,7 +23,7 @@
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import io.spring.initializr.actuate.stat.StatsProperties.Elastic;
import io.spring.initializr.generator.ProjectRequestEvent;
import io.spring.initializr.web.project.ProjectRequestEvent;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* Copyright 2012-2018 the original author or authors.
* Copyright 2012-2019 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.
@@ -24,12 +24,13 @@
import io.spring.initializr.actuate.stat.ProjectRequestDocument.DependencyInformation;
import io.spring.initializr.actuate.stat.ProjectRequestDocument.ErrorStateInformation;
import io.spring.initializr.actuate.stat.ProjectRequestDocument.VersionInformation;
import io.spring.initializr.generator.ProjectFailedEvent;
import io.spring.initializr.generator.ProjectRequest;
import io.spring.initializr.generator.ProjectRequestEvent;
import io.spring.initializr.metadata.InitializrMetadata;
import io.spring.initializr.util.Agent;
import io.spring.initializr.util.Version;
import io.spring.initializr.web.project.ProjectFailedEvent;
import io.spring.initializr.web.project.ProjectRequest;
import io.spring.initializr.web.project.ProjectRequestEvent;
import io.spring.initializr.web.project.WebProjectRequest;

import org.springframework.util.StringUtils;

@@ -43,7 +44,6 @@ public class ProjectRequestDocumentFactory {
public ProjectRequestDocument createDocument(ProjectRequestEvent event) {
InitializrMetadata metadata = event.getMetadata();
ProjectRequest request = event.getProjectRequest();

ProjectRequestDocument document = new ProjectRequestDocument();
document.setGenerationTimestamp(event.getTimestamp());
document.setGroupId(request.getGroupId());
@@ -118,30 +118,33 @@ private VersionInformation determineVersionInformation(ProjectRequest request) {
}

private ClientInformation determineClientInformation(ProjectRequest request) {
Agent agent = determineAgent(request);
String ip = determineIp(request);
String country = determineCountry(request);
if (agent != null || ip != null || country != null) {
return new ClientInformation(agent, ip, country);
if (request instanceof WebProjectRequest) {
WebProjectRequest webProjectRequest = (WebProjectRequest) request;
Agent agent = determineAgent(webProjectRequest);
String ip = determineIp(webProjectRequest);
String country = determineCountry(webProjectRequest);
if (agent != null || ip != null || country != null) {
return new ClientInformation(agent, ip, country);
}
}
return null;
}

private Agent determineAgent(ProjectRequest request) {
private Agent determineAgent(WebProjectRequest request) {
String userAgent = (String) request.getParameters().get("user-agent");
if (StringUtils.hasText(userAgent)) {
return Agent.fromUserAgent(userAgent);
}
return null;
}

private String determineIp(ProjectRequest request) {
private String determineIp(WebProjectRequest request) {
String candidate = (String) request.getParameters().get("cf-connecting-ip");
return (StringUtils.hasText(candidate)) ? candidate
: (String) request.getParameters().get("x-forwarded-for");
}

private String determineCountry(ProjectRequest request) {
private String determineCountry(WebProjectRequest request) {
String candidate = (String) request.getParameters().get("cf-ipcountry");
if (StringUtils.hasText(candidate) && !"xx".equalsIgnoreCase(candidate)) {
return candidate;

This file was deleted.

Original file line number Diff line number Diff line change
@@ -26,8 +26,11 @@
import java.util.UUID;

import io.spring.initializr.actuate.stat.StatsProperties.Elastic;
import io.spring.initializr.generator.ProjectGeneratedEvent;
import io.spring.initializr.generator.ProjectRequest;
import io.spring.initializr.metadata.InitializrMetadata;
import io.spring.initializr.test.metadata.InitializrMetadataTestBuilder;
import io.spring.initializr.web.project.ProjectGeneratedEvent;
import io.spring.initializr.web.project.ProjectRequest;
import io.spring.initializr.web.project.WebProjectRequest;
import org.json.JSONException;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
@@ -59,7 +62,13 @@
*
* @author Stephane Nicoll
*/
class ProjectGenerationStatPublisherTests extends AbstractInitializrStatTests {
class ProjectGenerationStatPublisherTests {

private final InitializrMetadata metadata = InitializrMetadataTestBuilder
.withDefaults().addDependencyGroup("core", "security", "validation", "aop")
.addDependencyGroup("web", "web", "data-rest", "jersey")
.addDependencyGroup("data", "data-jpa", "jdbc")
.addDependencyGroup("database", "h2", "mysql").build();

private RetryTemplate retryTemplate;

@@ -132,13 +141,13 @@ private void testAuthorization(String expectedUri,
.andRespond(withStatus(HttpStatus.CREATED)
.body(mockResponse(UUID.randomUUID().toString(), true))
.contentType(MediaType.APPLICATION_JSON));
this.statPublisher.handleEvent(createProjectGeneratedEvent(request));
handleEvent(request);
this.mockServer.verify();
}

@Test
void publishDocument() {
ProjectRequest request = createProjectRequest();
WebProjectRequest request = createProjectRequest();
request.setGroupId("com.example.acme");
request.setArtifactId("project");
request.setType("maven-project");
@@ -156,7 +165,7 @@ void publishDocument() {
.body(mockResponse(UUID.randomUUID().toString(), true))
.contentType(MediaType.APPLICATION_JSON));

this.statPublisher.handleEvent(createProjectGeneratedEvent(request));
handleEvent(request);
this.mockServer.verify();
}

@@ -177,7 +186,7 @@ void publishDocumentWithNoClientInformation() {
.body(mockResponse(UUID.randomUUID().toString(), true))
.contentType(MediaType.APPLICATION_JSON));

this.statPublisher.handleEvent(createProjectGeneratedEvent(request));
handleEvent(request);
this.mockServer.verify();
}

@@ -198,7 +207,7 @@ void publishDocumentWithInvalidType() {
.body(mockResponse(UUID.randomUUID().toString(), true))
.contentType(MediaType.APPLICATION_JSON));

this.statPublisher.handleEvent(createProjectGeneratedEvent(request));
handleEvent(request);
this.mockServer.verify();
}

@@ -219,7 +228,7 @@ void publishDocumentWithInvalidLanguage() {
.body(mockResponse(UUID.randomUUID().toString(), true))
.contentType(MediaType.APPLICATION_JSON));

this.statPublisher.handleEvent(createProjectGeneratedEvent(request));
handleEvent(request);
this.mockServer.verify();
}

@@ -241,7 +250,7 @@ void publishDocumentWithInvalidJavaVersion() {
.body(mockResponse(UUID.randomUUID().toString(), true))
.contentType(MediaType.APPLICATION_JSON));

this.statPublisher.handleEvent(createProjectGeneratedEvent(request));
handleEvent(request);
this.mockServer.verify();
}

@@ -262,7 +271,7 @@ void publishDocumentWithInvalidDependencies() {
.body(mockResponse(UUID.randomUUID().toString(), true))
.contentType(MediaType.APPLICATION_JSON));

this.statPublisher.handleEvent(createProjectGeneratedEvent(request));
handleEvent(request);
this.mockServer.verify();
}

@@ -284,7 +293,7 @@ void recoverFromError() {
.body(mockResponse(UUID.randomUUID().toString(), true))
.contentType(MediaType.APPLICATION_JSON));

this.statPublisher.handleEvent(createProjectGeneratedEvent(request));
handleEvent(request);
this.mockServer.verify();
}

@@ -302,12 +311,18 @@ void fatalErrorOnlyLogs() {
.andExpect(method(HttpMethod.POST))
.andRespond(withStatus(HttpStatus.INTERNAL_SERVER_ERROR));

this.statPublisher.handleEvent(createProjectGeneratedEvent(request));
handleEvent(request);
this.mockServer.verify();
}

private ProjectGeneratedEvent createProjectGeneratedEvent(ProjectRequest request) {
return new ProjectGeneratedEvent(request, getMetadata());
private WebProjectRequest createProjectRequest() {
WebProjectRequest request = new WebProjectRequest();
request.initialize(this.metadata);
return request;
}

private void handleEvent(ProjectRequest request) {
this.statPublisher.handleEvent(new ProjectGeneratedEvent(request, this.metadata));
}

private static String mockResponse(String id, boolean created) {
Original file line number Diff line number Diff line change
@@ -18,9 +18,12 @@

import java.util.Arrays;

import io.spring.initializr.generator.ProjectFailedEvent;
import io.spring.initializr.generator.ProjectGeneratedEvent;
import io.spring.initializr.generator.ProjectRequest;
import io.spring.initializr.metadata.InitializrMetadata;
import io.spring.initializr.test.metadata.InitializrMetadataTestBuilder;
import io.spring.initializr.web.project.ProjectFailedEvent;
import io.spring.initializr.web.project.ProjectGeneratedEvent;
import io.spring.initializr.web.project.ProjectRequest;
import io.spring.initializr.web.project.WebProjectRequest;
import org.junit.jupiter.api.Test;

import static org.assertj.core.api.Assertions.assertThat;
@@ -30,7 +33,13 @@
*
* @author Stephane Nicoll
*/
class ProjectRequestDocumentFactoryTests extends AbstractInitializrStatTests {
class ProjectRequestDocumentFactoryTests {

private final InitializrMetadata metadata = InitializrMetadataTestBuilder
.withDefaults().addDependencyGroup("core", "security", "validation", "aop")
.addDependencyGroup("web", "web", "data-rest", "jersey")
.addDependencyGroup("data", "data-jpa", "jdbc")
.addDependencyGroup("database", "h2", "mysql").build();

private final ProjectRequestDocumentFactory factory = new ProjectRequestDocumentFactory();

@@ -58,9 +67,19 @@ void createDocumentForSimpleProject() {
assertThat(document.getVersion().getMinor()).isEqualTo("2.1");
}

@Test
void createDocumentWithNonWebProjectRequest() {
ProjectRequest request = new ProjectRequest();
request.setBootVersion("2.1.0.RELEASE");
request.setType("maven-build");
ProjectGeneratedEvent event = createProjectGeneratedEvent(request);
ProjectRequestDocument document = this.factory.createDocument(event);
assertThat(document.getClient()).isNull();
}

@Test
void createDocumentWithRequestIp() {
ProjectRequest request = createProjectRequest();
WebProjectRequest request = createProjectRequest();
request.getParameters().put("x-forwarded-for", "10.0.0.123");
ProjectGeneratedEvent event = createProjectGeneratedEvent(request);
ProjectRequestDocument document = this.factory.createDocument(event);
@@ -70,7 +89,7 @@ void createDocumentWithRequestIp() {

@Test
void createDocumentWithRequestIpv6() {
ProjectRequest request = createProjectRequest();
WebProjectRequest request = createProjectRequest();
request.getParameters().put("x-forwarded-for", "2001:db8:a0b:12f0::1");
ProjectGeneratedEvent event = createProjectGeneratedEvent(request);
ProjectRequestDocument document = this.factory.createDocument(event);
@@ -80,7 +99,7 @@ void createDocumentWithRequestIpv6() {

@Test
void createDocumentWithCloudFlareHeaders() {
ProjectRequest request = createProjectRequest();
WebProjectRequest request = createProjectRequest();
request.getParameters().put("cf-connecting-ip", "10.0.0.123");
request.getParameters().put("cf-ipcountry", "BE");
ProjectGeneratedEvent event = createProjectGeneratedEvent(request);
@@ -91,7 +110,7 @@ void createDocumentWithCloudFlareHeaders() {

@Test
void createDocumentWithCloudFlareIpv6() {
ProjectRequest request = createProjectRequest();
WebProjectRequest request = createProjectRequest();
request.getParameters().put("cf-connecting-ip", "2001:db8:a0b:12f0::1");
ProjectGeneratedEvent event = createProjectGeneratedEvent(request);
ProjectRequestDocument document = this.factory.createDocument(event);
@@ -101,7 +120,7 @@ void createDocumentWithCloudFlareIpv6() {

@Test
void createDocumentWithCloudFlareHeadersAndOtherHeaders() {
ProjectRequest request = createProjectRequest();
WebProjectRequest request = createProjectRequest();
request.getParameters().put("cf-connecting-ip", "10.0.0.123");
request.getParameters().put("x-forwarded-for", "192.168.1.101");
ProjectGeneratedEvent event = createProjectGeneratedEvent(request);
@@ -112,7 +131,7 @@ void createDocumentWithCloudFlareHeadersAndOtherHeaders() {

@Test
void createDocumentWithCloudFlareCountrySetToXX() {
ProjectRequest request = createProjectRequest();
WebProjectRequest request = createProjectRequest();
request.getParameters().put("cf-connecting-ip", "Xx"); // case insensitive
ProjectGeneratedEvent event = createProjectGeneratedEvent(request);
ProjectRequestDocument document = this.factory.createDocument(event);
@@ -121,7 +140,7 @@ void createDocumentWithCloudFlareCountrySetToXX() {

@Test
void createDocumentWithUserAgent() {
ProjectRequest request = createProjectRequest();
WebProjectRequest request = createProjectRequest();
request.getParameters().put("user-agent", "HTTPie/0.8.0");
ProjectGeneratedEvent event = createProjectGeneratedEvent(request);
ProjectRequestDocument document = this.factory.createDocument(event);
@@ -131,7 +150,7 @@ void createDocumentWithUserAgent() {

@Test
void createDocumentWithUserAgentNoVersion() {
ProjectRequest request = createProjectRequest();
WebProjectRequest request = createProjectRequest();
request.getParameters().put("user-agent", "IntelliJ IDEA");
ProjectGeneratedEvent event = createProjectGeneratedEvent(request);
ProjectRequestDocument document = this.factory.createDocument(event);
@@ -221,7 +240,7 @@ void createDocumentInvalidDependency() {
@Test
void createDocumentWithProjectFailedEvent() {
ProjectRequest request = createProjectRequest();
ProjectFailedEvent event = new ProjectFailedEvent(request, getMetadata(),
ProjectFailedEvent event = new ProjectFailedEvent(request, this.metadata,
new IllegalStateException("my test message"));
ProjectRequestDocument document = this.factory.createDocument(event);
assertThat(document.getErrorState().isInvalid()).isTrue();
@@ -233,8 +252,14 @@ void createDocumentWithProjectFailedEvent() {
assertThat(document.getErrorState().getMessage()).isEqualTo("my test message");
}

private WebProjectRequest createProjectRequest() {
WebProjectRequest request = new WebProjectRequest();
request.initialize(this.metadata);
return request;
}

private ProjectGeneratedEvent createProjectGeneratedEvent(ProjectRequest request) {
return new ProjectGeneratedEvent(request, getMetadata());
return new ProjectGeneratedEvent(request, this.metadata);
}

}
10 changes: 10 additions & 0 deletions initializr-generator/pom.xml
Original file line number Diff line number Diff line change
@@ -14,6 +14,10 @@
</properties>

<dependencies>
<dependency>
<groupId>io.spring.initializr.experimental</groupId>
<artifactId>initializr-generator-spring</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot</artifactId>
@@ -38,6 +42,12 @@
<optional>true</optional>
</dependency>

<dependency>
<groupId>io.spring.initializr.experimental</groupId>
<artifactId>initializr-generator</artifactId>
<scope>test</scope>
<type>test-jar</type>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter</artifactId>

This file was deleted.

This file was deleted.

This file was deleted.

This file was deleted.

This file was deleted.

Binary file not shown.

This file was deleted.

172 changes: 0 additions & 172 deletions initializr-generator/src/main/resources/project/gradle3/gradlew

This file was deleted.

This file was deleted.

Binary file not shown.

This file was deleted.

172 changes: 0 additions & 172 deletions initializr-generator/src/main/resources/project/gradle4/gradlew

This file was deleted.

This file was deleted.

286 changes: 0 additions & 286 deletions initializr-generator/src/main/resources/project/maven/mvnw

This file was deleted.

161 changes: 0 additions & 161 deletions initializr-generator/src/main/resources/project/maven/mvnw.cmd

This file was deleted.

Binary file not shown.

This file was deleted.

This file was deleted.

14 changes: 0 additions & 14 deletions initializr-generator/src/main/resources/templates/Application.java

This file was deleted.

22 changes: 0 additions & 22 deletions initializr-generator/src/main/resources/templates/Application.kt

This file was deleted.

This file was deleted.

This file was deleted.

This file was deleted.

This file was deleted.

This file was deleted.

This file was deleted.

37 changes: 0 additions & 37 deletions initializr-generator/src/main/resources/templates/gitignore.tmpl

This file was deleted.

121 changes: 0 additions & 121 deletions initializr-generator/src/main/resources/templates/starter-build.gradle

This file was deleted.

276 changes: 0 additions & 276 deletions initializr-generator/src/main/resources/templates/starter-pom.xml

This file was deleted.

This file was deleted.

This file was deleted.

This file was deleted.

This file was deleted.

This file was deleted.

Loading

0 comments on commit e281480

Please sign in to comment.