Commit a3e3efb1 authored by Scott Frederick's avatar Scott Frederick

Convert to Spring Boot

parent 2fc8ba87
buildscript {
ext {
springBootVersion = '1.3.5.RELEASE'
springCloudConnectorsVersion = '1.2.2.RELEASE'
}
repositories {
jcenter()
mavenCentral()
......@@ -6,10 +11,7 @@ buildscript {
}
dependencies {
classpath 'org.gradle.api.plugins:gradle-tomcat-plugin:1.2.5'
classpath 'org.cloudfoundry:cf-gradle-plugin:1.1.3'
classpath("io.spring.gradle:dependency-management-plugin:0.5.3.RELEASE")
classpath("org.springframework.build.gradle:propdeps-plugin:0.0.7")
classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
}
}
......@@ -18,67 +20,34 @@ apply plugin: 'java'
apply plugin: 'eclipse-wtp'
apply plugin: 'idea'
apply plugin: 'tomcat'
apply plugin: 'war'
apply plugin: 'cloudfoundry'
apply plugin: 'io.spring.dependency-management'
apply plugin: 'propdeps'
apply plugin: "propdeps-idea"
apply plugin: 'spring-boot'
version = '1.0'
sourceSets {
main {
java {
srcDir 'src/main/java'
}
resources {
srcDir 'src/main/resources'
srcDir 'src/main/java'
}
}
}
sourceCompatibility = 1.7
targetCompatibility = 1.7
archivesBaseName = "spring-music"
jar {
manifest {
attributes 'Implementation-Title': 'Spring Sample Application', 'Implementation-Version': version
}
}
repositories {
mavenCentral()
maven { url "http://repo.spring.io/milestone" }
}
dependencyManagement {
imports {
mavenBom 'io.spring.platform:platform-bom:2.0.0.RC1'
}
maven { url "http://repo.spring.io/snapshot" }
}
dependencies {
// Spring and dependencies
compile "org.springframework:spring-context"
compile "org.springframework:spring-webmvc"
// Spring Cloud
compile "org.springframework.cloud:spring-cloud-spring-service-connector"
compile "org.springframework.cloud:spring-cloud-cloudfoundry-connector"
// Spring Data
compile "org.springframework.data:spring-data-jpa"
compile "org.springframework.data:spring-data-redis"
compile "org.springframework.data:spring-data-mongodb"
// Spring Boot
compile "org.springframework.boot:spring-boot-starter-web"
compile "org.springframework.boot:spring-boot-starter-actuator"
compile "org.springframework.boot:spring-boot-starter-data-jpa"
compile "org.springframework.boot:spring-boot-starter-data-mongodb"
compile "org.springframework.boot:spring-boot-starter-redis"
// Spring Cloud Connectors
compile "org.springframework.cloud:spring-cloud-core:${springCloudConnectorsVersion}"
compile "org.springframework.cloud:spring-cloud-spring-service-connector:${springCloudConnectorsVersion}"
compile "org.springframework.cloud:spring-cloud-cloudfoundry-connector:${springCloudConnectorsVersion}"
// JPA Persistence
compile "commons-dbcp:commons-dbcp"
compile "org.hibernate:hibernate-entitymanager"
runtime "com.h2database:h2"
runtime "mysql:mysql-connector-java"
runtime "postgresql:postgresql:9.1-901-1.jdbc4"
......@@ -86,10 +55,6 @@ dependencies {
// Redis Persistence
compile "redis.clients:jedis"
// JSR-303 validation
compile "javax.validation:validation-api"
compile "org.hibernate:hibernate-validator"
// Webjars
compile "org.webjars:bootstrap:3.1.1"
compile "org.webjars:angularjs:1.2.16"
......@@ -97,60 +62,15 @@ dependencies {
compile "org.webjars:angular-ui-bootstrap:0.10.0-1"
compile "org.webjars:jquery:2.1.0-2"
// Jackson
compile "org.codehaus.jackson:jackson-core-asl:1.9.13"
compile "org.codehaus.jackson:jackson-mapper-asl:1.9.13"
compile "com.fasterxml.jackson.core:jackson-core"
compile "com.fasterxml.jackson.core:jackson-databind"
// Logging
compile "org.slf4j:slf4j-api"
compile "org.slf4j:slf4j-log4j12"
// Servlet
compile "javax.servlet:jstl:1.2"
providedCompile 'javax.servlet:javax.servlet-api'
// Testing
testCompile "junit:junit"
// Spring Testing
testCompile "org.springframework:spring-test"
// Tomcat
tomcat "org.apache.tomcat.embed:tomcat-embed-core:${tomcatVersion}"
tomcat "org.apache.tomcat.embed:tomcat-embed-logging-juli:${tomcatVersion}"
tomcat("org.apache.tomcat.embed:tomcat-embed-jasper:${tomcatVersion}") {
exclude group: 'org.eclipse.jdt.core.compiler', module: 'ecj'
}
}
task wrapper(type: Wrapper) {
gradleVersion = '2.3'
}
war {
// omit the version from the war file name
version = ""
}
tomcatRun {
outputFile = file('tomcat.log')
jar {
baseName = "spring-music"
version = "" // omit the version from the war file name
}
cloudfoundry {
target = "https://api.run.pivotal.io"
space = "development"
file = file("${war.archivePath}")
uri = "spring-music-${randomWord}.cfapps.io"
memory = 512
instances = 1
services {
"music-mongodb" {
label = "mongolab"
plan = "sandbox"
}
}
task wrapper(type: Wrapper) {
gradleVersion = '2.14'
}
#Wed May 20 16:48:48 CDT 2015
#Fri Jul 01 14:31:42 EDT 2016
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-2.3-all.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-2.14-bin.zip
......@@ -42,11 +42,6 @@ case "`uname`" in
;;
esac
# For Cygwin, ensure paths are in UNIX format before anything is touched.
if $cygwin ; then
[ -n "$JAVA_HOME" ] && JAVA_HOME=`cygpath --unix "$JAVA_HOME"`
fi
# Attempt to set APP_HOME
# Resolve links: $0 may be a link
PRG="$0"
......@@ -61,9 +56,9 @@ while [ -h "$PRG" ] ; do
fi
done
SAVED="`pwd`"
cd "`dirname \"$PRG\"`/" >&-
cd "`dirname \"$PRG\"`/" >/dev/null
APP_HOME="`pwd -P`"
cd "$SAVED" >&-
cd "$SAVED" >/dev/null
CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
......@@ -114,6 +109,7 @@ fi
if $cygwin ; then
APP_HOME=`cygpath --path --mixed "$APP_HOME"`
CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
JAVACMD=`cygpath --unix "$JAVACMD"`
# We build the pattern for arguments to be converted via cygpath
ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
......
---
applications:
- name: spring-music
memory: 512M
instances: 1
memory: 1G
random-route: true
path: build/libs/spring-music.war
path: build/libs/spring-music.jar
package org.cloudfoundry.samples.music;
import org.cloudfoundry.samples.music.config.SpringApplicationContextInitializer;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.context.web.SpringBootServletInitializer;
@SpringBootApplication
public class Application extends SpringBootServletInitializer {
public static void main(String[] args) {
new SpringApplicationBuilder(Application.class).
initializers(new SpringApplicationContextInitializer())
.application()
.run(args);
}
}
\ No newline at end of file
package org.cloudfoundry.samples.music.config;
import org.cloudfoundry.samples.music.config.root.RepositoryConfig;
import org.cloudfoundry.samples.music.config.web.WebMvcConfig;
import org.springframework.util.StringUtils;
import org.springframework.web.WebApplicationInitializer;
import org.springframework.web.context.ContextLoader;
import org.springframework.web.context.ContextLoaderListener;
import org.springframework.web.context.support.AnnotationConfigWebApplicationContext;
import org.springframework.web.servlet.DispatcherServlet;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRegistration;
public class AppInitializer implements WebApplicationInitializer {
@Override
public void onStartup(ServletContext container) throws ServletException {
configureAppContextInitializers(container, SpringApplicationContextInitializer.class.getName());
createRootAppContext(container, RepositoryConfig.class);
createDispatcherServlet(container, WebMvcConfig.class);
}
private void configureAppContextInitializers(ServletContext container, String... initClassNames) {
String initializerClasses = container.getInitParameter(ContextLoader.CONTEXT_INITIALIZER_CLASSES_PARAM);
String delimitedClassNames = StringUtils.arrayToDelimitedString(initClassNames, " ");
if (StringUtils.hasText(initializerClasses)) {
initializerClasses += " " + delimitedClassNames;
}
else {
initializerClasses = delimitedClassNames;
}
container.setInitParameter(ContextLoader.CONTEXT_INITIALIZER_CLASSES_PARAM, initializerClasses);
}
private void createRootAppContext(ServletContext container, java.lang.Class<?>... configClasses) {
AnnotationConfigWebApplicationContext rootContext = new AnnotationConfigWebApplicationContext();
rootContext.register(configClasses);
container.addListener(new ContextLoaderListener(rootContext));
}
private void createDispatcherServlet(ServletContext container, java.lang.Class<?>... configClasses) {
AnnotationConfigWebApplicationContext webContext = new AnnotationConfigWebApplicationContext();
webContext.register(configClasses);
DispatcherServlet dispatcherServlet = new DispatcherServlet(webContext);
ServletRegistration.Dynamic dispatcher = container.addServlet("dispatcher", dispatcherServlet);
dispatcher.setLoadOnStartup(1);
dispatcher.addMapping("/");
}
}
......@@ -12,18 +12,17 @@ import org.springframework.cloud.service.common.OracleServiceInfo;
import org.springframework.cloud.service.common.PostgresqlServiceInfo;
import org.springframework.cloud.service.common.RedisServiceInfo;
import org.springframework.context.ApplicationContextInitializer;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.core.env.ConfigurableEnvironment;
import org.springframework.util.StringUtils;
import org.springframework.web.context.support.AnnotationConfigWebApplicationContext;
import java.util.*;
public class SpringApplicationContextInitializer implements ApplicationContextInitializer<AnnotationConfigWebApplicationContext> {
public class SpringApplicationContextInitializer implements ApplicationContextInitializer<ConfigurableApplicationContext> {
private static final Log logger = LogFactory.getLog(SpringApplicationContextInitializer.class);
private static final Map<Class<? extends ServiceInfo>, String> serviceTypeToProfileName =
new HashMap<Class<? extends ServiceInfo>, String>();
private static final Map<Class<? extends ServiceInfo>, String> serviceTypeToProfileName = new HashMap<>();
private static final List<String> validLocalProfiles = Arrays.asList("mysql", "postgres", "mongodb", "redis");
public static final String IN_MEMORY_PROFILE = "in-memory";
......@@ -37,7 +36,7 @@ public class SpringApplicationContextInitializer implements ApplicationContextIn
}
@Override
public void initialize(AnnotationConfigWebApplicationContext applicationContext) {
public void initialize(ConfigurableApplicationContext applicationContext) {
Cloud cloud = getCloud();
ConfigurableEnvironment appEnvironment = applicationContext.getEnvironment();
......@@ -60,7 +59,7 @@ public class SpringApplicationContextInitializer implements ApplicationContextIn
return null;
}
List<String> profiles = new ArrayList<String>();
List<String> profiles = new ArrayList<>();
List<ServiceInfo> serviceInfos = cloud.getServiceInfos();
......@@ -97,7 +96,7 @@ public class SpringApplicationContextInitializer implements ApplicationContextIn
}
private String[] getActiveProfile(ConfigurableEnvironment appEnvironment) {
List<String> serviceProfiles = new ArrayList<String>();
List<String> serviceProfiles = new ArrayList<>();
for (String profile : appEnvironment.getActiveProfiles()) {
if (validLocalProfiles.contains(profile)) {
......
package org.cloudfoundry.samples.music.config.data;
import org.cloudfoundry.samples.music.domain.Album;
import org.hibernate.ejb.HibernatePersistence;
import org.springframework.context.annotation.Bean;
import org.springframework.orm.jpa.JpaTransactionManager;
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
import javax.persistence.EntityManagerFactory;
import javax.sql.DataSource;
import java.util.HashMap;
import java.util.Map;
public abstract class AbstractJpaRepositoryConfig {
@Bean(name = "entityManagerFactory")
public LocalContainerEntityManagerFactoryBean entityManagerFactory(DataSource dataSource) {
return createEntityManagerFactoryBean(dataSource, getHibernateDialect());
}
@Bean(name = "transactionManager")
public JpaTransactionManager transactionManager(EntityManagerFactory entityManagerFactory) {
return new JpaTransactionManager(entityManagerFactory);
}
protected abstract String getHibernateDialect();
protected LocalContainerEntityManagerFactoryBean createEntityManagerFactoryBean(DataSource dataSource, String dialectClassName) {
Map<String, String> properties = new HashMap<String, String>();
properties.put(org.hibernate.cfg.Environment.HBM2DDL_AUTO, "update");
properties.put(org.hibernate.cfg.Environment.DIALECT, dialectClassName);
properties.put(org.hibernate.cfg.Environment.SHOW_SQL, "true");
LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
em.setDataSource(dataSource);
em.setPackagesToScan(Album.class.getPackage().getName());
em.setPersistenceProvider(new HibernatePersistence());
em.setJpaPropertyMap(properties);
return em;
}
}
......@@ -2,9 +2,11 @@ package org.cloudfoundry.samples.music.config.data;
import org.apache.commons.dbcp.BasicDataSource;
import javax.sql.DataSource;
public class AbstractLocalDataSourceConfig {
protected BasicDataSource createBasicDataSource(String jdbcUrl, String driverClass, String userName, String password) {
protected DataSource createDataSource(String jdbcUrl, String driverClass, String userName, String password) {
BasicDataSource dataSource = new BasicDataSource();
dataSource.setUrl(jdbcUrl);
dataSource.setDriverClassName(driverClass);
......
package org.cloudfoundry.samples.music.config.data;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Profile;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseBuilder;
import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseType;
import javax.sql.DataSource;
@Configuration
@Profile("in-memory")
@EnableJpaRepositories("org.cloudfoundry.samples.music.repositories.jpa")
public class H2DataSourceConfig extends AbstractLocalDataSourceConfig {
@Bean
public DataSource dataSource() {
return new EmbeddedDatabaseBuilder()
.setName("music")
.setType(EmbeddedDatabaseType.H2)
.build();
}
}
package org.cloudfoundry.samples.music.config.data;
import org.hibernate.dialect.H2Dialect;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Profile;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
@Configuration
@Profile("in-memory")
@EnableJpaRepositories("org.cloudfoundry.samples.music.repositories.jpa")
public class LocalJpaRepositoryConfig extends AbstractJpaRepositoryConfig {
protected String getHibernateDialect() {
return H2Dialect.class.getName();
}
}
package org.cloudfoundry.samples.music.config.data;
import org.cloudfoundry.samples.music.repositories.mongodb.MongoAlbumRepository;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Profile;
import org.springframework.data.mongodb.MongoDbFactory;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.repository.config.EnableMongoRepositories;
@Configuration
@Profile("mongodb")
@EnableMongoRepositories(basePackageClasses = {MongoAlbumRepository.class})
public class MongoConfig {
@Bean
......
......@@ -12,7 +12,7 @@ public class MySqlLocalDataSourceConfig extends AbstractLocalDataSourceConfig {
@Bean
public DataSource dataSource() {
return createBasicDataSource("jdbc:mysql://localhost/music", "com.mysql.jdbc.Driver", "", "");
return createDataSource("jdbc:mysql://localhost/music", "com.mysql.jdbc.Driver", "", "");
}
}
package org.cloudfoundry.samples.music.config.data;
import org.hibernate.dialect.MySQL5Dialect;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Profile;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
@Configuration
@Profile("mysql")
@EnableJpaRepositories("org.cloudfoundry.samples.music.repositories.jpa")
public class MySqlRepositoryConfig extends AbstractJpaRepositoryConfig {
protected String getHibernateDialect() {
return MySQL5Dialect.class.getName();
}
}
package org.cloudfoundry.samples.music.config.data;
import org.hibernate.dialect.Oracle10gDialect;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Profile;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
@Configuration
@Profile("oracle")
@EnableJpaRepositories("org.cloudfoundry.samples.music.repositories.jpa")
public class OracleRepositoryConfig extends AbstractJpaRepositoryConfig {
protected String getHibernateDialect() {
return Oracle10gDialect.class.getName();
}
}
......@@ -12,7 +12,7 @@ public class PostgresLocalDataSourceConfig extends AbstractLocalDataSourceConfig
@Bean
public DataSource dataSource() {
return createBasicDataSource("jdbc:postgresql://localhost/music",
return createDataSource("jdbc:postgresql://localhost/music",
"org.postgresql.Driver", "postgres", "postgres");
}
......
package org.cloudfoundry.samples.music.config.data;
import org.hibernate.dialect.PostgreSQL82Dialect;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Profile;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
@Configuration
@Profile("postgres")
@EnableJpaRepositories("org.cloudfoundry.samples.music.repositories.jpa")
public class PostgresRepositoryConfig extends AbstractJpaRepositoryConfig {
protected String getHibernateDialect() {
return PostgreSQL82Dialect.class.getName();
}
}
......@@ -7,7 +7,7 @@ import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Profile;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.JacksonJsonRedisSerializer;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.RedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
......@@ -22,12 +22,12 @@ public class RedisConfig {
@Bean
public RedisTemplate<String, Album> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
RedisTemplate<String, Album> template = new RedisTemplate<String, Album>();
RedisTemplate<String, Album> template = new RedisTemplate<>();
template.setConnectionFactory(redisConnectionFactory);
RedisSerializer<String> stringSerializer = new StringRedisSerializer();
RedisSerializer<Album> albumSerializer = new JacksonJsonRedisSerializer<Album>(Album.class);
RedisSerializer<Album> albumSerializer = new Jackson2JsonRedisSerializer<>(Album.class);
template.setKeySerializer(stringSerializer);
template.setValueSerializer(albumSerializer);
......
package org.cloudfoundry.samples.music.config.root;
import org.cloudfoundry.samples.music.config.data.LocalJpaRepositoryConfig;
import org.cloudfoundry.samples.music.repositories.AlbumRepository;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
@Configuration
@ComponentScan(basePackageClasses = {AlbumRepository.class, LocalJpaRepositoryConfig.class})
public class RepositoryConfig {
}
package org.cloudfoundry.samples.music.config.web;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.*;
import org.springframework.web.servlet.view.InternalResourceViewResolver;
import org.cloudfoundry.samples.music.web.controllers.AlbumController;
@Configuration
@EnableWebMvc
@ComponentScan(basePackageClasses = {AlbumController.class})
public class WebMvcConfig extends WebMvcConfigurerAdapter {
@Bean
public InternalResourceViewResolver internalResourceViewResolver() {
InternalResourceViewResolver internalResourceViewResolver = new InternalResourceViewResolver();
internalResourceViewResolver.setPrefix("/WEB-INF/");
internalResourceViewResolver.setSuffix(".html");
return internalResourceViewResolver;
}
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/assets/**").addResourceLocations("/assets/");
registry.addResourceHandler("/webjars/**").addResourceLocations("classpath:/META-INF/resources/webjars/");
}
@Override
public void addViewControllers(ViewControllerRegistry registry) {
registry.addViewController("/").setViewName("index");
}
@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
configurer.enable();
}
}
package org.cloudfoundry.samples.music.repositories;
import org.cloudfoundry.samples.music.domain.Album;
import org.springframework.data.repository.CrudRepository;
public interface AlbumRepository extends CrudRepository<Album, String> {
}
......@@ -11,6 +11,7 @@ import org.springframework.context.ApplicationListener;
import org.springframework.context.event.ContextRefreshedEvent;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;
import org.springframework.data.repository.CrudRepository;
import org.springframework.data.repository.init.Jackson2ResourceReader;
import org.springframework.stereotype.Component;
......@@ -38,8 +39,8 @@ public class AlbumRepositoryPopulator implements ApplicationListener<ContextRefr
@Override
public void onApplicationEvent(ContextRefreshedEvent event) {
if (event.getApplicationContext().equals(applicationContext)) {
AlbumRepository albumRepository =
BeanFactoryUtils.beanOfTypeIncludingAncestors(applicationContext, AlbumRepository.class);
CrudRepository albumRepository =
BeanFactoryUtils.beanOfTypeIncludingAncestors(applicationContext, CrudRepository.class);
if (albumRepository != null && albumRepository.count() == 0) {
populate(albumRepository);
......@@ -49,7 +50,7 @@ public class AlbumRepositoryPopulator implements ApplicationListener<ContextRefr
}
@SuppressWarnings("unchecked")
public void populate(AlbumRepository repository) {
public void populate(CrudRepository repository) {
Object entity = getEntityFromResource(sourceData);
if (entity instanceof Collection) {
......@@ -59,7 +60,7 @@ public class AlbumRepositoryPopulator implements ApplicationListener<ContextRefr
}
}
} else {
repository.save((Album) entity);
repository.save(entity);
}
}
......
package org.cloudfoundry.samples.music.repositories.jpa;
import org.cloudfoundry.samples.music.domain.Album;
import org.cloudfoundry.samples.music.repositories.AlbumRepository;
import org.springframework.context.annotation.Profile;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
@Repository
public interface JpaAlbumRepository extends JpaRepository<Album, String>, AlbumRepository {
@Profile({"in-memory", "mysql", "postgres", "oracle"})
public interface JpaAlbumRepository extends JpaRepository<Album, String> {
}
package org.cloudfoundry.samples.music.repositories.mongodb;
import org.cloudfoundry.samples.music.domain.Album;
import org.cloudfoundry.samples.music.repositories.AlbumRepository;
import org.springframework.context.annotation.Profile;
import org.springframework.data.mongodb.repository.MongoRepository;
import org.springframework.stereotype.Repository;
@Repository
public interface MongoAlbumRepository extends MongoRepository<Album, String>, AlbumRepository {
@Profile("mongodb")
public interface MongoAlbumRepository extends MongoRepository<Album, String> {
}
\ No newline at end of file
......@@ -2,15 +2,15 @@ package org.cloudfoundry.samples.music.repositories.redis;
import org.cloudfoundry.samples.music.domain.Album;
import org.cloudfoundry.samples.music.domain.RandomIdGenerator;
import org.cloudfoundry.samples.music.repositories.AlbumRepository;
import org.springframework.data.redis.core.HashOperations;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.repository.CrudRepository;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
public class RedisAlbumRepository implements AlbumRepository {
public class RedisAlbumRepository implements CrudRepository<Album, String> {
public static final String ALBUMS_KEY = "albums";
private final RandomIdGenerator idGenerator;
......@@ -34,7 +34,7 @@ public class RedisAlbumRepository implements AlbumRepository {
@Override
public <S extends Album> Iterable<S> save(Iterable<S> albums) {
List<S> result = new ArrayList<S>();
List<S> result = new ArrayList<>();
for (S entity : albums) {
save(entity);
......@@ -95,7 +95,7 @@ public class RedisAlbumRepository implements AlbumRepository {
}
private <T> List<T> convertIterableToList(Iterable<T> iterable) {
List<T> list = new ArrayList<T>();
List<T> list = new ArrayList<>();
for (T object : iterable) {
list.add(object);
}
......
package org.cloudfoundry.samples.music.web.controllers;
package org.cloudfoundry.samples.music.web;
import org.cloudfoundry.samples.music.domain.Album;
import org.cloudfoundry.samples.music.repositories.AlbumRepository;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.data.repository.CrudRepository;
import org.springframework.web.bind.annotation.*;
import javax.validation.Valid;
@Controller
@RestController
@RequestMapping(value = "/albums")
public class AlbumController {
private static final Logger logger = LoggerFactory.getLogger(AlbumController.class);
private AlbumRepository repository;
private CrudRepository<Album, String> repository;
@Autowired
public AlbumController(AlbumRepository repository) {
public AlbumController(CrudRepository<Album, String> repository) {
this.repository = repository;
}
@ResponseBody
@RequestMapping(method = RequestMethod.GET)
public Iterable<Album> albums() {
return repository.findAll();
}
@ResponseBody
@RequestMapping(method = RequestMethod.PUT)
public Album add(@RequestBody @Valid Album album) {
logger.info("Adding album " + album.getId());
return repository.save(album);
}
@ResponseBody
@RequestMapping(method = RequestMethod.POST)
public Album update(@RequestBody @Valid Album album) {
logger.info("Updating album " + album.getId());
return repository.save(album);
}
@ResponseBody
@RequestMapping(value = "/{id}", method = RequestMethod.GET)
public Album getById(@PathVariable String id) {
logger.info("Getting album " + id);
return repository.findOne(id);
}
@ResponseBody
@RequestMapping(value = "/{id}", method = RequestMethod.DELETE)
public void deleteById(@PathVariable String id) {
logger.info("Deleting album " + id);
......
package org.cloudfoundry.samples.music.web.controllers;
package org.cloudfoundry.samples.music.web;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
@Controller
@RestController
@RequestMapping("/errors")
public class ErrorController {
private static final Logger logger = LoggerFactory.getLogger(ErrorController.class);
@ResponseBody
@RequestMapping(value = "/kill")
public void kill() {
logger.info("Forcing application exit");
System.exit(1);
}
@ResponseBody
@RequestMapping(value = "/throw")
public void throwException() {
logger.info("Forcing an exception to be thrown");
......
package org.cloudfoundry.samples.music.web.controllers;
package org.cloudfoundry.samples.music.web;
import org.cloudfoundry.samples.music.domain.ApplicationInfo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.Cloud;
import org.springframework.cloud.service.ServiceInfo;
import org.springframework.core.env.Environment;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
@Controller
@RestController
public class InfoController {
@Autowired(required = false)
private Cloud cloud;
......@@ -25,25 +23,17 @@ public class InfoController {
this.springEnvironment = springEnvironment;
}
@ResponseBody
@RequestMapping(value = "/info")
@RequestMapping(value = "/appinfo")
public ApplicationInfo info() {
return new ApplicationInfo(springEnvironment.getActiveProfiles(), getServiceNames());
}
@RequestMapping(value = "/env")
@ResponseBody
public Map<String, String> showEnvironment() {
return System.getenv();
}
@RequestMapping(value = "/service")
@ResponseBody
public List<ServiceInfo> showServiceInfo() {
if (cloud != null) {
return cloud.getServiceInfos();
} else {
return new ArrayList<ServiceInfo>();
return new ArrayList<>();
}
}
......@@ -51,7 +41,7 @@ public class InfoController {
if (cloud != null) {
final List<ServiceInfo> serviceInfos = cloud.getServiceInfos();
List<String> names = new ArrayList<String>();
List<String> names = new ArrayList<>();
for (ServiceInfo serviceInfo : serviceInfos) {
names.add(serviceInfo.getId());
}
......
---
spring:
jpa:
generate-ddl: true
# Direct log messages to stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n
# Root logger option
log4j.rootLogger=INFO,stdout
......@@ -4,18 +4,18 @@
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta name="description" content="Spring Music">
<meta name="title" content="Spring Music">
<link rel="shortcut icon" href="assets/favicon.ico">
<link rel="shortcut icon" href="favicon.ico">
<title>Spring Music</title>
<link rel="stylesheet" type="text/css" href="webjars/bootstrap/3.1.1/css/bootstrap.css">
<link rel="stylesheet" type="text/css" href="assets/css/app.css">
<link rel="stylesheet" type="text/css" href="assets/css/multi-columns-row.css">
<link rel="stylesheet" type="text/css" href="css/app.css">
<link rel="stylesheet" type="text/css" href="css/multi-columns-row.css">
</head>
<body>
<div class="container">
<div class="row">
<div ng-include="'assets/templates/header.html'"></div>
<div ng-include="'templates/header.html'"></div>
</div>
<div id="body" class="row">
......@@ -23,7 +23,7 @@
</div>
<div class="row">
<div ng-include="'assets/templates/footer.html'"></div>
<div ng-include="'templates/footer.html'"></div>
</div>
</div>
......@@ -38,10 +38,10 @@
<script type="text/javascript" src="webjars/bootstrap/3.1.1/js/bootstrap.js"></script>
<script type="text/javascript" src="assets/js/app.js"></script>
<script type="text/javascript" src="assets/js/albums.js"></script>
<script type="text/javascript" src="assets/js/errors.js"></script>
<script type="text/javascript" src="assets/js/info.js"></script>
<script type="text/javascript" src="assets/js/status.js"></script>
<script type="text/javascript" src="js/app.js"></script>
<script type="text/javascript" src="js/albums.js"></script>
<script type="text/javascript" src="js/errors.js"></script>
<script type="text/javascript" src="js/info.js"></script>
<script type="text/javascript" src="js/status.js"></script>
</body>
</html>
......@@ -9,15 +9,15 @@ angular.module('albums', ['ngResource', 'ui.bootstrap']).
var editorEnabled = {};
var enable = function (id, fieldName) {
this.editorEnabled = { 'id': id, 'fieldName': fieldName };
editorEnabled = { 'id': id, 'fieldName': fieldName };
};
var disable = function () {
this.editorEnabled = {};
editorEnabled = {};
};
var isEnabled = function(id, fieldName) {
return (this.editorEnabled['id'] == id && this.editorEnabled['fieldName'] == fieldName);
return (editorEnabled['id'] == id && editorEnabled['fieldName'] == fieldName);
};
return {
......@@ -50,7 +50,7 @@ function AlbumsController($scope, $modal, Albums, Album, Status) {
$scope.addAlbum = function () {
var addModal = $modal.open({
templateUrl: 'assets/templates/albumForm.html',
templateUrl: 'templates/albumForm.html',
controller: AlbumModalController,
resolve: {
album: function () {
......@@ -69,7 +69,7 @@ function AlbumsController($scope, $modal, Albums, Album, Status) {
$scope.updateAlbum = function (album) {
var updateModal = $modal.open({
templateUrl: 'assets/templates/albumForm.html',
templateUrl: 'templates/albumForm.html',
controller: AlbumModalController,
resolve: {
album: function() {
......@@ -99,7 +99,7 @@ function AlbumsController($scope, $modal, Albums, Album, Status) {
};
$scope.setAlbumsView = function (viewName) {
$scope.albumsView = "assets/templates/" + viewName + ".html";
$scope.albumsView = "templates/" + viewName + ".html";
};
$scope.init = function() {
......
......@@ -4,11 +4,11 @@ angular.module('SpringMusic', ['albums', 'errors', 'status', 'info', 'ngRoute',
$routeProvider.when('/errors', {
controller: 'ErrorsController',
templateUrl: 'assets/templates/errors.html'
templateUrl: 'templates/errors.html'
});
$routeProvider.otherwise({
controller: 'AlbumsController',
templateUrl: 'assets/templates/albums.html'
templateUrl: 'templates/albums.html'
});
}
);
angular.module('info', ['ngResource']).
factory('Info', function ($resource) {
return $resource('info');
return $resource('appinfo');
});
function InfoController($scope, Info) {
......
......@@ -20,7 +20,7 @@
</div>
<div class="row">
<div ng-include src="'assets/templates/status.html'"></div>
<div ng-include src="'templates/status.html'"></div>
</div>
<div class="row multi-columns-row">
......
......@@ -4,7 +4,7 @@
</div>
<div class="row">
<div ng-include src="'assets/templates/status.html'"></div>
<div ng-include src="'templates/status.html'"></div>
</div>
<div class="row">
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment