diff --git a/initializr/pom.xml b/initializr/pom.xml
index a307342a..b9faa7fd 100644
--- a/initializr/pom.xml
+++ b/initializr/pom.xml
@@ -30,6 +30,10 @@
com.fasterxml.jackson.core
jackson-core
+
+ com.google.guava
+ guava
+
org.codehaus.groovy
@@ -40,6 +44,10 @@
org.codehaus.groovy
groovy-ant
+
+ org.codehaus.groovy
+ groovy-json
+
org.springframework.boot
@@ -77,6 +85,11 @@
pom
import
+
+ com.google.guava
+ guava
+ 16.0
+
xmlunit
xmlunit
diff --git a/initializr/src/main/groovy/io/spring/initializr/DefaultInitializrMetadataProvider.groovy b/initializr/src/main/groovy/io/spring/initializr/DefaultInitializrMetadataProvider.groovy
new file mode 100644
index 00000000..f70156d7
--- /dev/null
+++ b/initializr/src/main/groovy/io/spring/initializr/DefaultInitializrMetadataProvider.groovy
@@ -0,0 +1,66 @@
+/*
+ * Copyright 2012-2014 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
+ *
+ * http://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 io.spring.initializr
+
+import org.slf4j.Logger
+import org.slf4j.LoggerFactory
+
+import org.springframework.beans.factory.annotation.Autowired
+import org.springframework.cache.annotation.Cacheable
+
+/**
+ * A default {@link InitializrMetadataProvider} that is able to refresh
+ * the metadata with the status of the main spring.io site.
+ *
+ * @author Stephane Nicoll
+ * @since 1.0
+ */
+class DefaultInitializrMetadataProvider implements InitializrMetadataProvider {
+
+ private static final Logger logger = LoggerFactory.getLogger(DefaultInitializrMetadataProvider)
+
+ private final InitializrMetadata metadata
+
+ @Autowired
+ DefaultInitializrMetadataProvider(InitializrMetadata metadata) {
+ this.metadata = metadata
+ }
+
+ @Override
+ @Cacheable(value = 'initializr', key = "'metadata'")
+ InitializrMetadata get() {
+ List bootVersions = fetchBootVersions()
+ if (bootVersions != null && !bootVersions.isEmpty()) {
+ metadata.merge(bootVersions)
+ }
+ metadata
+ }
+
+ protected List fetchBootVersions() {
+ def url = metadata.env.springBootMetadataUrl
+ if (url != null) {
+ try {
+ logger.info('Fetching boot metadata from '+ url)
+ return new SpringBootMetadataReader(url).getBootVersions()
+ } catch (Exception e) {
+ logger.warn('Failed to fetch spring boot metadata', e)
+ }
+ }
+ null
+ }
+
+}
diff --git a/initializr/src/main/groovy/io/spring/initializr/InitializrAutoConfiguration.groovy b/initializr/src/main/groovy/io/spring/initializr/InitializrAutoConfiguration.groovy
index 4b8b36f1..dc0ccb14 100644
--- a/initializr/src/main/groovy/io/spring/initializr/InitializrAutoConfiguration.groovy
+++ b/initializr/src/main/groovy/io/spring/initializr/InitializrAutoConfiguration.groovy
@@ -1,9 +1,17 @@
package io.spring.initializr
+import java.util.concurrent.ConcurrentMap
+import java.util.concurrent.TimeUnit
+
+import com.google.common.cache.CacheBuilder
import io.spring.initializr.web.MainController
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean
import org.springframework.boot.context.properties.EnableConfigurationProperties
+import org.springframework.cache.CacheManager
+import org.springframework.cache.annotation.EnableCaching
+import org.springframework.cache.concurrent.ConcurrentMapCache
+import org.springframework.cache.support.SimpleCacheManager
import org.springframework.context.annotation.Bean
import org.springframework.context.annotation.Configuration
@@ -20,18 +28,44 @@ import org.springframework.context.annotation.Configuration
* @since 1.0
*/
@Configuration
-@EnableConfigurationProperties(InitializrMetadata.class)
+@EnableCaching
+@EnableConfigurationProperties(InitializrMetadata)
class InitializrAutoConfiguration {
@Bean
- @ConditionalOnMissingBean(MainController.class)
+ @ConditionalOnMissingBean(MainController)
MainController initializrMainController() {
new MainController()
}
@Bean
- @ConditionalOnMissingBean(ProjectGenerator.class)
+ @ConditionalOnMissingBean(ProjectGenerator)
ProjectGenerator projectGenerator() {
new ProjectGenerator()
}
+
+ @Bean
+ @ConditionalOnMissingBean(InitializrMetadataProvider)
+ InitializrMetadataProvider initializrMetadataProvider(InitializrMetadata metadata) {
+ return new DefaultInitializrMetadataProvider(metadata)
+ }
+
+ @Bean
+ @ConditionalOnMissingBean(CacheManager)
+ CacheManager cacheManager() {
+ SimpleCacheManager cacheManager = new SimpleCacheManager()
+ cacheManager.setCaches(Arrays.asList(
+ createConcurrentMapCache(600, 'initializr')
+ ))
+ cacheManager
+ }
+
+ private static ConcurrentMapCache createConcurrentMapCache(Long timeToLive, String name) {
+ CacheBuilder