Previously, if one invokes the service asking for dependency `foo` and
`foo` does not exist we created a starter for it, that is
`spring-boot-starter-foo`. This mechanism was put in place because we
don't know all starters and to offer a nice fallback for users who know
what they're doing.
That statement proved to be wrong since users actually discover new
starters via the service and don't seem to attempt to create such starter
that are located in the `org.springframework.boot` groupId anyway. Most
if not all of those are pilot errors.
This commit enables strict validation of dependencies and generate an
appropriate exception if it isn't defined in the meta-data.
Closes gh-234
This commit switches SingleSelectCapability content to
CopyOnWriteArrayList to prevent ArrayIndexOutOfBoundsException in case
of concurrent updates of boot versions.
Note that there is way to mitigate that in 1.4 with the use of the `sync`
attribute, see gh-251
Closes gh-229
As of Spring Boot 1.4.0.M3, `SpringBootServletInitializer` has been
relocated to the `org.springframework.boot.web.support` package. This
commit makes sure to use the new location if a project is generated for
Spring Boot `1.4.0.M3` or higher.
Closes gh-243
This commit improves the dependency mapping infrastructure to include the
groupId and artifactId attributes alongside the existing version. For
consistency, the attribute has been renamed from `versions` to
`mappings`.
This allows to better support the `redis` use case: the starter was
renamed from `spring-boot-starter-redis` to
`spring-boot-starter-data-redis` and previously we had two entries
excluding each other using version ranges.
Closes gh-219
Spring Boot `1.4.0.M2` brings a new test infrastructure with nice
defaults and deprecates `SpringBootConfiguration` in the process.
This commits automatically upgrades generated project to this new
infrastructure if Spring Boot `1.4.0.M2` or later is available.
Closes gh-215
This commit splits the feature of Spring Initializr in several modules:
* `initializr-generator` is a standalone library that is responsible for
generating projects based on a `File` directory. It has a minimal set of
dependencies and is not web-related
* `initializr-web` provides the web integration (project generation,
meta-data, etc)
* `initializr-actuator` is an optional module that can be added to
support project-generation-specific statistics
Closes gh-214
If an elastic instance is available, publish a document to a
configurable index every time a `ProjectRequest` is handled by the
service.
In practice, this means that every attempt to generate a project leads to
a new document in the index. The document gathers the settings of the
required project, including invalid ones if any. If an exception is
thrown, the message of the cause is made available.
CloudFlare is explicitely supported and the IP and country of the request
is added to the document. If that information is not available and the
request contains a `X-Forwarded-For` header, the value is also associated
with the document. If an IPv4 is detected, it is set in a separate
`requestIpv4` property.
If for some reason the document could not be indexed, we attempt to retry
a configurable amount of times.
Closes gh-185
Parse the `User-Agent` http request header to determine if the client is
known. If that is the case, increment the relevant `client_id` counter.
A `ProjectRequest` had now a generic `parameters` array with all the
request headers by default. Since we don't want to accidentally map any
of those from a form input, `BasicProjectRequest` contains only "public"
fields and is the type exposed at the controller level.
Closes gh-193
`1.3.2.RELEASE` is available now so there is no need to have a version
range on the snapshot. We don't need to copy/paste the version of the
bom in the actual dependency (that's the whole business of the bom
definition (including versions mapping according to the Spring Boot
version).
We want the `cloud-bom` to be automatically added when the data flow bom
is required so it is referenced as "additional BOM" as well.
Closes gh-189
BOMs are structured in such a way than adding one to the project may
require another one(s) to be added to the project.
This commit adds an `additionalBoms` property to `BillOfMaterials` that
can be used to refer the BOM(s) that should be automatically added if
said BOM is added to the project.
Closes gh-190
Previously, Spring Initializr was refering to
`spring-cloud-starter-parent` as the BOM source for any cloud-related
dependencies.
This pom actually inherits from a specific version of Spring Boot and
brings all its dependency management. If the chosen boot version and the
one that the cloud bom brings do not match, inconsistent versions can
appear in the project.
The underlying issue was fixed by providing a new BOM that only provides
dependency management for the cloud-related bits.
Closes gh-116
Previously, only an invalid type or an invalid dependency would lead to
an exception and in such case, no event is fired at all.
This commit adds validation for language and packaging as well as a new
event that is fired when the project could not be generated.
The metrics infrastructure has been updated to handle ProjectFailedEvent;
when such an event is fired, the 'failures' counter is increased and we
still record all the other metrics.
Closes gh-188
Replace `ProjectGenerationListener` by an event that is thrown via the
regular `ApplicationEventPublisher`. This allows any arbitrary bean to
listen to the event without the need of implementing an interface.
Closes gh-184
As of Spring Boot 1.4, lombok is managed and we should no longer provide
a version for it. This commit makes sure to remove the version as of
Spring Boot 1.4
Closes gh-182
Spring Boot 1.4 has renamed the `spring-boot-starter-redis` to
`spring-boot-starter-redis`. This commit adds support for the former up
to 1.4 (exclusive) and the later as from 1.4
Closes gh-174
If the `initializr.env.google-analytics-tracking-code` is specified with
the tracking code to use, the web UI automatically integrates with Google
Analytics.
Closes gh-180