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