diff --git a/spring-boot-dependencies/pom.xml b/spring-boot-dependencies/pom.xml index 6d6f4fb0dd..1b5c41cb6f 100644 --- a/spring-boot-dependencies/pom.xml +++ b/spring-boot-dependencies/pom.xml @@ -71,7 +71,6 @@ 3.2.1 2.3.23 2.2.0 - 8.2.0 3.0.0 1.12 2.4.6 @@ -152,6 +151,7 @@ 1.0.3.RELEASE 2.0.9.RELEASE 1.1.0.RELEASE + 1.1.0.RELEASE 1.1.4.RELEASE 2.0.3.RELEASE 1.0.2.RELEASE @@ -669,17 +669,6 @@ jackson-module-parameter-names ${jackson.version} - - com.gemstone.gemfire - gemfire - ${gemfire.version} - - - org.springframework.data - spring-data-gemfire - - - com.github.ben-manes.caffeine caffeine @@ -2053,6 +2042,11 @@ spring-session-data-redis ${spring-session.version} + + org.springframework.shell + spring-shell + ${spring-shell.version} + org.springframework.social spring-social-config diff --git a/spring-boot-samples/spring-boot-sample-data-gemfire/pom.xml b/spring-boot-samples/spring-boot-sample-data-gemfire/pom.xml index 0072a4b964..1589db8f85 100644 --- a/spring-boot-samples/spring-boot-sample-data-gemfire/pom.xml +++ b/spring-boot-samples/spring-boot-sample-data-gemfire/pom.xml @@ -8,8 +8,8 @@ 1.4.0.BUILD-SNAPSHOT spring-boot-sample-data-gemfire - Spring Boot Data Gemfire Sample - Spring Boot Data Gemfire Sample + Spring Boot Data GemFire Sample + Spring Boot Data GemFire Sample http://projects.spring.io/spring-boot/ Pivotal Software, Inc. @@ -32,6 +32,11 @@ spring-boot-starter-test test + + org.springframework.shell + spring-shell + runtime + diff --git a/spring-boot-samples/spring-boot-sample-data-gemfire/src/main/java/sample/data/gemfire/SampleDataGemFireApplication.java b/spring-boot-samples/spring-boot-sample-data-gemfire/src/main/java/sample/data/gemfire/SampleDataGemFireApplication.java index 2fdbc4bdb8..797be742a9 100644 --- a/spring-boot-samples/spring-boot-sample-data-gemfire/src/main/java/sample/data/gemfire/SampleDataGemFireApplication.java +++ b/spring-boot-samples/spring-boot-sample-data-gemfire/src/main/java/sample/data/gemfire/SampleDataGemFireApplication.java @@ -16,12 +16,26 @@ package sample.data.gemfire; +import java.util.Properties; + +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.context.annotation.ImportResource; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.context.annotation.Bean; +import org.springframework.data.gemfire.CacheFactoryBean; +import org.springframework.data.gemfire.GemfireTransactionManager; +import org.springframework.data.gemfire.RegionAttributesFactoryBean; +import org.springframework.data.gemfire.ReplicatedRegionFactoryBean; import org.springframework.data.gemfire.repository.config.EnableGemfireRepositories; import org.springframework.transaction.annotation.EnableTransactionManagement; +import com.gemstone.gemfire.cache.Cache; +import com.gemstone.gemfire.cache.RegionAttributes; + +import sample.data.gemfire.config.SampleDataGemFireApplicationProperties; +import sample.data.gemfire.domain.Gemstone; + /** * The GemstoneAppConfiguration class for allowing Spring Boot to pick up additional * application Spring configuration meta-data for GemFire, which must be specified in @@ -30,13 +44,73 @@ import org.springframework.transaction.annotation.EnableTransactionManagement; * @author John Blum */ @SpringBootApplication -@ImportResource("/spring-data-gemfire-cache.xml") @EnableGemfireRepositories @EnableTransactionManagement +@EnableConfigurationProperties(SampleDataGemFireApplicationProperties.class) +@SuppressWarnings("unused") public class SampleDataGemFireApplication { + protected static final String GEMSTONES_REGION_NAME = "Gemstones"; + public static void main(final String[] args) { SpringApplication.run(SampleDataGemFireApplication.class, args); } + @Autowired + SampleDataGemFireApplicationProperties applicationProperties; + + Properties gemfireProperties() { + Properties gemfireProperties = new Properties(); + + gemfireProperties.setProperty("name", SampleDataGemFireApplication.class.getSimpleName()); + gemfireProperties.setProperty("mcast-port", "0"); + gemfireProperties.setProperty("locators", ""); + gemfireProperties.setProperty("log-level", applicationProperties.getLogLevel()); + + return gemfireProperties; + } + + @Bean + CacheFactoryBean gemfireCache() { + CacheFactoryBean gemfireCache = new CacheFactoryBean(); + + gemfireCache.setClose(true); + gemfireCache.setProperties(gemfireProperties()); + + return gemfireCache; + } + + @Bean(name = GEMSTONES_REGION_NAME) + ReplicatedRegionFactoryBean gemstonesRegion(Cache gemfireCache, + RegionAttributes gemstonesRegionAttributes) { + + ReplicatedRegionFactoryBean gemstonesRegion = + new ReplicatedRegionFactoryBean(); + + gemstonesRegion.setAttributes(gemstonesRegionAttributes); + gemstonesRegion.setClose(false); + gemstonesRegion.setCache(gemfireCache); + gemstonesRegion.setName(GEMSTONES_REGION_NAME); + gemstonesRegion.setPersistent(false); + + return gemstonesRegion; + } + + @Bean + @SuppressWarnings("unchecked") + RegionAttributesFactoryBean gemstonesRegionAttributes() { + RegionAttributesFactoryBean gemstonesRegionAttributes = + new RegionAttributesFactoryBean(); + + gemstonesRegionAttributes.setKeyConstraint(Long.class); + gemstonesRegionAttributes.setValueConstraint(Gemstone.class); + + return gemstonesRegionAttributes; + } + + @Bean + GemfireTransactionManager gemfireTransactionManager(Cache gemfireCache) { + return new GemfireTransactionManager(gemfireCache); + } + } diff --git a/spring-boot-samples/spring-boot-sample-data-gemfire/src/main/java/sample/data/gemfire/config/SampleDataGemFireApplicationProperties.java b/spring-boot-samples/spring-boot-sample-data-gemfire/src/main/java/sample/data/gemfire/config/SampleDataGemFireApplicationProperties.java new file mode 100644 index 0000000000..0e2d9c8db5 --- /dev/null +++ b/spring-boot-samples/spring-boot-sample-data-gemfire/src/main/java/sample/data/gemfire/config/SampleDataGemFireApplicationProperties.java @@ -0,0 +1,47 @@ +/* + * Copyright 2010-2013 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 sample.data.gemfire.config; + +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.util.StringUtils; + +/** + * The SampleDataGemFireApplicationProperties class... + * + * @author John Blum + * @since 1.0.0 + */ +@ConfigurationProperties(prefix = "sample.data.gemfire") +public class SampleDataGemFireApplicationProperties { + + protected static final String DEFAULT_LOG_LEVEL = "config"; + + private String logLevel = DEFAULT_LOG_LEVEL; + + protected String defaultIfEmpty(String value, String defaultValue) { + return (StringUtils.hasText(value) ? value : defaultValue); + } + + public String getLogLevel() { + return defaultIfEmpty(this.logLevel, DEFAULT_LOG_LEVEL); + } + + public void setLogLevel(String logLevel) { + this.logLevel = logLevel; + } + +} diff --git a/spring-boot-samples/spring-boot-sample-data-gemfire/src/main/java/sample/data/gemfire/domain/Gemstone.java b/spring-boot-samples/spring-boot-sample-data-gemfire/src/main/java/sample/data/gemfire/domain/Gemstone.java index 2303ac0110..6f7841bd21 100644 --- a/spring-boot-samples/spring-boot-sample-data-gemfire/src/main/java/sample/data/gemfire/domain/Gemstone.java +++ b/spring-boot-samples/spring-boot-sample-data-gemfire/src/main/java/sample/data/gemfire/domain/Gemstone.java @@ -89,7 +89,7 @@ public class Gemstone implements Serializable { @Override public String toString() { return String.format("{ @type = %1$s, id = %2$d, name = %3$s }", - getClass().getName(), getId(), getName()); + getClass().getName(), getId(), getName()); } } diff --git a/spring-boot-samples/spring-boot-sample-data-gemfire/src/main/java/sample/data/gemfire/service/GemstoneServiceImpl.java b/spring-boot-samples/spring-boot-sample-data-gemfire/src/main/java/sample/data/gemfire/service/GemstoneServiceImpl.java index e0c9f4021b..49f6a0981c 100644 --- a/spring-boot-samples/spring-boot-sample-data-gemfire/src/main/java/sample/data/gemfire/service/GemstoneServiceImpl.java +++ b/spring-boot-samples/spring-boot-sample-data-gemfire/src/main/java/sample/data/gemfire/service/GemstoneServiceImpl.java @@ -19,16 +19,15 @@ package sample.data.gemfire.service; import java.util.ArrayList; import java.util.Arrays; import java.util.List; - import javax.annotation.PostConstruct; -import sample.data.gemfire.domain.Gemstone; - import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.Assert; +import sample.data.gemfire.domain.Gemstone; + /** * The GemstoneServiceImpl class is a Service object implementing the GemstoneService * interface containing business logic and rules in addition to data services for @@ -40,17 +39,17 @@ import org.springframework.util.Assert; public class GemstoneServiceImpl implements GemstoneService { protected static final List APPROVED_GEMS = new ArrayList( - Arrays.asList("ALEXANDRITE", "AQUAMARINE", "DIAMOND", "OPAL", "PEARL", "RUBY", - "SAPPHIRE", "SPINEL", "TOPAZ")); + Arrays.asList("ALEXANDRITE", "AQUAMARINE", "DIAMOND", "OPAL", "PEARL", "RUBY", + "SAPPHIRE", "SPINEL", "TOPAZ")); @Autowired - private GemstoneRepository gemstoneRepo; + @SuppressWarnings("unused") + private GemstoneRepository gemstoneRepository; @PostConstruct public void init() { - Assert.notNull(this.gemstoneRepo, - "A reference to the 'GemstoneRepository' was not properly configured!"); - System.out.printf("%1$s initialized!%n", getClass().getSimpleName()); + Assert.notNull(gemstoneRepository, "'gemstoneRepository' was not properly initialized"); + System.out.printf("[%1$s] initialized!%n", getClass().getSimpleName()); } /** @@ -62,7 +61,7 @@ public class GemstoneServiceImpl implements GemstoneService { @Override @Transactional(readOnly = true) public long count() { - return this.gemstoneRepo.count(); + return this.gemstoneRepository.count(); } /** @@ -75,8 +74,8 @@ public class GemstoneServiceImpl implements GemstoneService { */ @Override @Transactional(readOnly = true) - public Gemstone get(final Long id) { - return this.gemstoneRepo.findOne(id); + public Gemstone get(Long id) { + return this.gemstoneRepository.findOne(id); } /** @@ -89,8 +88,8 @@ public class GemstoneServiceImpl implements GemstoneService { */ @Override @Transactional(readOnly = true) - public Gemstone get(final String name) { - return this.gemstoneRepo.findByName(name); + public Gemstone get(String name) { + return this.gemstoneRepository.findByName(name); } /** @@ -105,7 +104,7 @@ public class GemstoneServiceImpl implements GemstoneService { @Override @Transactional(readOnly = true) public Iterable list() { - return this.gemstoneRepo.findAll(); + return this.gemstoneRepository.findAll(); } /** @@ -118,37 +117,36 @@ public class GemstoneServiceImpl implements GemstoneService { */ @Override @Transactional - public Gemstone save(final Gemstone gemstone) { + public Gemstone save(Gemstone gemstone) { Assert.notNull(gemstone, "The Gemstone to save must not be null!"); Assert.notNull(gemstone.getName(), "The name of the Gemstone must be specified!"); - // NOTE deliberately (naively) validate the Gemstone after mutating data access in - // GemFire rather than before - // to demonstrate transactions in GemFire. - Gemstone savedGemstone = validate(this.gemstoneRepo.save(gemstone)); + // NOTE deliberately (& naively) validate the Gemstone after mutating data access in + // GemFire rather than before to demonstrate transactions in GemFire. + Gemstone savedGemstone = validate(this.gemstoneRepository.save(gemstone)); - Assert.state(savedGemstone.equals(get(gemstone.getId())), - String.format( - "Failed to find Gemstone (%1$s) in GemFire's Cache Region 'Gemstones'!", - gemstone)); + Assert.state(savedGemstone.equals(get(gemstone.getId())), String.format( + "Failed to find Gemstone (%1$s) in GemFire's Cache Region 'Gemstones'!", + gemstone)); - System.out.printf("Saved Gemstone (%1$s)%n", savedGemstone.getName()); + System.out.printf("Saved Gemstone [%1$s]%n", savedGemstone.getName()); return gemstone; } - private Gemstone validate(final Gemstone gemstone) { + Gemstone validate(Gemstone gemstone) { if (!APPROVED_GEMS.contains(gemstone.getName().toUpperCase())) { - // NOTE if the Gemstone is not valid, blow chunks (should cause transaction to - // rollback in GemFire)! - System.err.printf("Illegal Gemstone (%1$s)!%n", gemstone.getName()); + // NOTE if the Gemstone is not valid, throw error... + // Should cause transaction to rollback in GemFire! + System.err.printf("Illegal Gemstone [%1$s]!%n", gemstone.getName()); throw new IllegalGemstoneException( - String.format("'%1$s' is not a valid Gemstone!", gemstone.getName())); + String.format("[%1$s] is not a valid Gemstone!", gemstone.getName())); } return gemstone; } + @SuppressWarnings("unused") public static final class IllegalGemstoneException extends IllegalArgumentException { public IllegalGemstoneException() { diff --git a/spring-boot-samples/spring-boot-sample-data-gemfire/src/main/resources/spring-data-gemfire-cache.xml b/spring-boot-samples/spring-boot-sample-data-gemfire/src/main/resources/spring-data-gemfire-cache.xml deleted file mode 100644 index 82da83da84..0000000000 --- a/spring-boot-samples/spring-boot-sample-data-gemfire/src/main/resources/spring-data-gemfire-cache.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - GemstonesSpringGemFireApp - config - 0 - - - - - - - - - diff --git a/spring-boot-samples/spring-boot-sample-data-gemfire/src/test/java/sample/data/gemfire/SampleDataGemFireApplicationTests.java b/spring-boot-samples/spring-boot-sample-data-gemfire/src/test/java/sample/data/gemfire/SampleDataGemFireApplicationTests.java index bf1f2e3252..7fa39ac18a 100644 --- a/spring-boot-samples/spring-boot-sample-data-gemfire/src/test/java/sample/data/gemfire/SampleDataGemFireApplicationTests.java +++ b/spring-boot-samples/spring-boot-sample-data-gemfire/src/test/java/sample/data/gemfire/SampleDataGemFireApplicationTests.java @@ -16,20 +16,20 @@ package sample.data.gemfire; +import static org.assertj.core.api.Assertions.assertThat; + import java.util.concurrent.atomic.AtomicLong; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; -import sample.data.gemfire.domain.Gemstone; -import sample.data.gemfire.service.GemstoneService; -import sample.data.gemfire.service.GemstoneServiceImpl.IllegalGemstoneException; - import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner; -import static org.assertj.core.api.Assertions.assertThat; +import sample.data.gemfire.domain.Gemstone; +import sample.data.gemfire.service.GemstoneService; +import sample.data.gemfire.service.GemstoneServiceImpl.IllegalGemstoneException; /** * The SampleDataGemFireApplicationTests class is a test suite with test cases testing the @@ -42,9 +42,10 @@ import static org.assertj.core.api.Assertions.assertThat; public class SampleDataGemFireApplicationTests { @Autowired + @SuppressWarnings("unused") private GemstoneService gemstoneService; - private final AtomicLong ID_GENERATOR = new AtomicLong(0l); + private final AtomicLong idGenerator = new AtomicLong(0l); @Before public void setup() { @@ -52,7 +53,7 @@ public class SampleDataGemFireApplicationTests { } @Test - public void testGemstonesApp() { + public void gemstonesAppServiceEndpoints() { assertThat(this.gemstoneService.count()).isEqualTo(0); assertThat(this.gemstoneService.list()).isEmpty(); @@ -60,37 +61,41 @@ public class SampleDataGemFireApplicationTests { this.gemstoneService.save(createGemstone("Ruby")); assertThat(this.gemstoneService.count()).isEqualTo(2); - assertThat(this.gemstoneService.list()).contains(getGemstones("Diamond", "Ruby")); + assertThat(this.gemstoneService.list()).contains( + getGemstones("Diamond", "Ruby")); try { this.gemstoneService.save(createGemstone("Coal")); } - catch (IllegalGemstoneException ex) { - // Expected + catch (IllegalGemstoneException ignore) { + // expected } assertThat(this.gemstoneService.count()).isEqualTo(2); - assertThat(this.gemstoneService.list()).contains(getGemstones("Diamond", "Ruby")); + assertThat(this.gemstoneService.list()).contains( + getGemstones("Diamond", "Ruby")); this.gemstoneService.save(createGemstone("Pearl")); this.gemstoneService.save(createGemstone("Sapphire")); assertThat(this.gemstoneService.count()).isEqualTo(4); - assertThat(this.gemstoneService.list()) - .contains(getGemstones("Diamond", "Ruby", "Pearl", "Sapphire")); + assertThat(this.gemstoneService.list()).contains( + getGemstones("Diamond", "Ruby", "Pearl", "Sapphire")); try { this.gemstoneService.save(createGemstone("Quartz")); } - catch (IllegalGemstoneException expected) { + catch (IllegalGemstoneException ignore) { + // expected } assertThat(this.gemstoneService.count()).isEqualTo(4); - assertThat(this.gemstoneService.list()) - .contains(getGemstones("Diamond", "Ruby", "Pearl", "Sapphire")); - assertThat(this.gemstoneService.get("Diamond")) - .isEqualTo(createGemstone("Diamond")); - assertThat(this.gemstoneService.get("Pearl")).isEqualTo(createGemstone("Pearl")); + assertThat(this.gemstoneService.list()).contains( + getGemstones("Diamond", "Ruby", "Pearl", "Sapphire")); + assertThat(this.gemstoneService.get("Diamond")).isEqualTo( + createGemstone("Diamond")); + assertThat(this.gemstoneService.get("Pearl")).isEqualTo( + createGemstone("Pearl")); } private Gemstone[] getGemstones(String... names) { @@ -102,7 +107,7 @@ public class SampleDataGemFireApplicationTests { } private Gemstone createGemstone(String name) { - return createGemstone(this.ID_GENERATOR.incrementAndGet(), name); + return createGemstone(this.idGenerator.incrementAndGet(), name); } private Gemstone createGemstone(Long id, String name) { diff --git a/spring-boot-starters/spring-boot-starter-data-gemfire/pom.xml b/spring-boot-starters/spring-boot-starter-data-gemfire/pom.xml index bd56d65877..2c38863ced 100644 --- a/spring-boot-starters/spring-boot-starter-data-gemfire/pom.xml +++ b/spring-boot-starters/spring-boot-starter-data-gemfire/pom.xml @@ -8,8 +8,9 @@ spring-boot-starter-data-gemfire Spring Boot Data GemFire Starter - Starter for using GemFire distributed data store and Spring Data - GemFire + + Starter for using GemFire distributed data store and Spring Data GemFire. + http://projects.spring.io/spring-boot/ Pivotal Software, Inc. @@ -24,8 +25,8 @@ spring-boot-starter - com.gemstone.gemfire - gemfire + org.springframework.data + spring-data-gemfire commons-logging @@ -33,18 +34,11 @@ - - org.springframework.data - spring-data-gemfire - - - org.aspectj - aspectjweaver - repo.spring.io + Spring libs-release Maven Repository http://repo.spring.io/libs-release true diff --git a/spring-boot-starters/spring-boot-starter-data-gemfire/src/main/resources/META-INF/spring.provides b/spring-boot-starters/spring-boot-starter-data-gemfire/src/main/resources/META-INF/spring.provides index 52b4808d1d..6788816558 100644 --- a/spring-boot-starters/spring-boot-starter-data-gemfire/src/main/resources/META-INF/spring.provides +++ b/spring-boot-starters/spring-boot-starter-data-gemfire/src/main/resources/META-INF/spring.provides @@ -1 +1 @@ -provides: gemfire,spring-data-gemfire +provides: spring-data-gemfire