diff --git a/spring-boot-dependencies/pom.xml b/spring-boot-dependencies/pom.xml
index 56208f031f0..7b94eab5edf 100644
--- a/spring-boot-dependencies/pom.xml
+++ b/spring-boot-dependencies/pom.xml
@@ -52,6 +52,7 @@
1.4
1.6
1.3.0-beta14
+ 7.0.1
1.6
2.3.0-rc-1
1.3.175
@@ -87,6 +88,7 @@
3.0.2.RELEASE
2.2.6.RELEASE
1.0.0.RELEASE
+ 1.3.3.RELEASE
1.1.1.RELEASE
Codd-SR2
0.9.0.RELEASE
@@ -311,6 +313,11 @@
jetty-annotations
${jetty.version}
+
+ com.gemstone.gemfire
+ gemfire
+ ${gemfire.version}
+
org.hamcrest
hamcrest-library
@@ -525,7 +532,12 @@
spring-batch-core
${spring-batch.version}
-
+
+ org.springframework.data
+ spring-data-gemfire
+ ${spring-data-gemfire.version}
+
+
org.springframework.data
spring-data-releasetrain
${spring-data-releasetrain.version}
diff --git a/spring-boot-parent/pom.xml b/spring-boot-parent/pom.xml
index 88d1493f912..683e2dce80f 100644
--- a/spring-boot-parent/pom.xml
+++ b/spring-boot-parent/pom.xml
@@ -217,7 +217,7 @@
false
-
+
diff --git a/spring-boot-samples/pom.xml b/spring-boot-samples/pom.xml
index 32d0e4faf3f..289f89c9579 100644
--- a/spring-boot-samples/pom.xml
+++ b/spring-boot-samples/pom.xml
@@ -27,6 +27,7 @@
spring-boot-sample-amqp
spring-boot-sample-aop
spring-boot-sample-batch
+ spring-boot-sample-data-gemfire
spring-boot-sample-data-jpa
spring-boot-sample-data-mongodb
spring-boot-sample-data-redis
diff --git a/spring-boot-samples/spring-boot-sample-data-gemfire/pom.xml b/spring-boot-samples/spring-boot-sample-data-gemfire/pom.xml
new file mode 100644
index 00000000000..67185e3f218
--- /dev/null
+++ b/spring-boot-samples/spring-boot-sample-data-gemfire/pom.xml
@@ -0,0 +1,39 @@
+
+
+ 4.0.0
+
+
+ org.springframework.boot
+ spring-boot-samples
+ 1.0.1.BUILD-SNAPSHOT
+
+ spring-boot-sample-data-gemfire
+ jar
+
+ ${basedir}/../..
+
+
+
+ org.springframework.boot
+ spring-boot-starter
+
+
+ org.springframework.boot
+ spring-boot-starter-data-gemfire
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ test
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+
+
+
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
new file mode 100644
index 00000000000..896d3588100
--- /dev/null
+++ b/spring-boot-samples/spring-boot-sample-data-gemfire/src/main/java/sample/data/gemfire/SampleDataGemFireApplication.java
@@ -0,0 +1,53 @@
+/*
+ * 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;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.ImportResource;
+import org.springframework.data.gemfire.repository.config.EnableGemfireRepositories;
+import org.springframework.transaction.annotation.EnableTransactionManagement;
+
+/**
+ * The GemstoneAppConfiguration class for allowing Spring Boot to pickup additional application Spring configuration
+ * meta-data for GemFire, which must be specified in Spring Data GemFire's XML namespace.
+ *
+ * @author John Blum
+ * @see org.springframework.boot.autoconfigure.EnableAutoConfiguration
+ * @see org.springframework.context.annotation.ComponentScan
+ * @see org.springframework.context.annotation.Configuration
+ * @see org.springframework.context.annotation.ImportResource
+ * @see org.springframework.data.gemfire.repository.config.EnableGemfireRepositories
+ * @see org.springframework.transaction.annotation.EnableTransactionManagement
+ * @since 1.0.0
+ */
+@Configuration
+@ImportResource("/spring-data-gemfire-cache.xml")
+@ComponentScan
+@EnableAutoConfiguration
+@EnableGemfireRepositories
+@EnableTransactionManagement
+@SuppressWarnings("unused")
+public class SampleDataGemFireApplication {
+
+ public static void main(final String[] args) {
+ SpringApplication.run(SampleDataGemFireApplication.class, args);
+ }
+
+}
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
new file mode 100644
index 00000000000..5fd7f067413
--- /dev/null
+++ b/spring-boot-samples/spring-boot-sample-data-gemfire/src/main/java/sample/data/gemfire/domain/Gemstone.java
@@ -0,0 +1,99 @@
+/*
+ * 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.domain;
+
+import java.io.Serializable;
+
+import org.springframework.data.annotation.Id;
+import org.springframework.data.gemfire.mapping.Region;
+import org.springframework.util.ObjectUtils;
+
+/**
+ * The Gemstone class is an abstract data type modeling a Gemstone, such as a diamond or a ruby.
+ *
+ * @author John Blum
+ * @see java.io.Serializable
+ * @see org.springframework.data.annotation.Id
+ * @see org.springframework.data.gemfire.mapping.Region
+ * @since 1.0.0
+ */
+@Region("Gemstones")
+@SuppressWarnings("unused")
+public class Gemstone implements Serializable {
+
+ @Id
+ private Long id;
+
+ private String name;
+
+ public Gemstone() {
+ }
+
+ public Gemstone(final Long id) {
+ this.id = id;
+ }
+
+ public Gemstone(final Long id, final String name) {
+ this.id = id;
+ this.name = name;
+ }
+
+ public Long getId() {
+ return id;
+ }
+
+ public void setId(final Long id) {
+ this.id = id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(final String name) {
+ this.name = name;
+ }
+
+ @Override
+ public boolean equals(final Object obj) {
+ if (obj == this) {
+ return true;
+ }
+
+ if (!(obj instanceof Gemstone)) {
+ return false;
+ }
+
+ Gemstone that = (Gemstone) obj;
+
+ return ObjectUtils.nullSafeEquals(this.getName(), that.getName());
+ }
+
+ @Override
+ public int hashCode() {
+ int hashValue = 17;
+ hashValue = 37 * hashValue + ObjectUtils.nullSafeHashCode(getName());
+ return hashValue;
+ }
+
+ @Override
+ public String toString() {
+ return String.format("{ @type = %1$s, id = %2$d, name = %3$s }",
+ getClass().getName(), getId(), getName());
+ }
+
+}
diff --git a/spring-boot-samples/spring-boot-sample-data-gemfire/src/main/java/sample/data/gemfire/service/GemstoneRepository.java b/spring-boot-samples/spring-boot-sample-data-gemfire/src/main/java/sample/data/gemfire/service/GemstoneRepository.java
new file mode 100644
index 00000000000..2039138287a
--- /dev/null
+++ b/spring-boot-samples/spring-boot-sample-data-gemfire/src/main/java/sample/data/gemfire/service/GemstoneRepository.java
@@ -0,0 +1,45 @@
+/*
+ * 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.service;
+
+import org.springframework.data.gemfire.repository.GemfireRepository;
+
+import sample.data.gemfire.domain.Gemstone;
+
+/**
+ * The GemstoneRepository interface is an extension of the GemfireRepository abstraction for encapsulating data access
+ * and persistence operations (CRUD) on Gemstone domain objects.
+ *
+ * @author John Blum
+ * @see org.springframework.data.gemfire.repository.GemfireRepository
+ * @see sample.data.gemfire.domain.Gemstone
+ * @since 1.0.0
+ */
+public interface GemstoneRepository extends GemfireRepository {
+
+ /**
+ * Finds a particular Gemstone in the GemFire Cache by name.
+ *
+ *
+ * @param the Class type of the Gemstone domain object to find.
+ * @param name a String value indicating the name of the Gemstone to find.
+ * @return a Gemstone by name.
+ * @see sample.data.gemfire.domain.Gemstone
+ */
+ T findByName(String name);
+
+}
diff --git a/spring-boot-samples/spring-boot-sample-data-gemfire/src/main/java/sample/data/gemfire/service/GemstoneService.java b/spring-boot-samples/spring-boot-sample-data-gemfire/src/main/java/sample/data/gemfire/service/GemstoneService.java
new file mode 100644
index 00000000000..6201264f6f7
--- /dev/null
+++ b/spring-boot-samples/spring-boot-sample-data-gemfire/src/main/java/sample/data/gemfire/service/GemstoneService.java
@@ -0,0 +1,80 @@
+/*
+ * 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.service;
+
+import sample.data.gemfire.domain.Gemstone;
+
+/**
+ * The GemstoneService interface is a Service interface object contract defining business operations for processing
+ * Gemstone domain objects.
+ *
+ * @author John Blum
+ * @see sample.data.gemfire.domain.Gemstone
+ * @since 1.0.0
+ */
+@SuppressWarnings("unused")
+public interface GemstoneService {
+
+ /**
+ * Returns a count of the number of Gemstones in the GemFire Cache.
+ *
+ *
+ * @return a long value indicating the number of Gemstones in the GemFire Cache.
+ */
+ long count();
+
+ /**
+ * Gets a Gemstone by ID.
+ *
+ *
+ * @param id a long value indicating the identifier of the Gemstone.
+ * @return a Gemstone with ID, or null if no Gemstone exists with ID.
+ * @see sample.data.gemfire.domain.Gemstone
+ */
+ Gemstone get(Long id);
+
+ /**
+ * Gets a Gemstone by name.
+ *
+ *
+ * @param name a String value indicating the name of the Gemstone.
+ * @return a Gemstone with name, or null if no Gemstone exists with name.
+ * @see sample.data.gemfire.domain.Gemstone
+ */
+ Gemstone get(String name);
+
+ /**
+ * Return a listing of Gemstones currently stored in the GemFire Cache.
+ *
+ *
+ * @return a Iterable object to iterate over the list of Gemstones currently stored in the GemFire Cache.
+ * @see java.lang.Iterable
+ * @see sample.data.gemfire.domain.Gemstone
+ */
+ Iterable list();
+
+ /**
+ * Saves the specified Gemstone to the GemFire Cache.
+ *
+ *
+ * @param gemstone the Gemstone to save in the GemFire Cache.
+ * @return the saved Gemstone.
+ * @see sample.data.gemfire.domain.Gemstone
+ */
+ Gemstone save(Gemstone gemstone);
+
+}
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
new file mode 100644
index 00000000000..91bff07efca
--- /dev/null
+++ b/spring-boot-samples/spring-boot-sample-data-gemfire/src/main/java/sample/data/gemfire/service/GemstoneServiceImpl.java
@@ -0,0 +1,162 @@
+/*
+ * 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.service;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import javax.annotation.PostConstruct;
+
+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 processing Gemstones.
+ *
+ * @author John Blum
+ * @see org.springframework.stereotype.Service
+ * @see org.springframework.transaction.annotation.Transactional
+ * @see sample.data.gemfire.domain.Gemstone
+ * @see sample.data.gemfire.service.GemstoneRepository
+ * @see sample.data.gemfire.service.GemstoneService
+ * @since 1.0.0
+ */
+@Service("gemstoneService")
+@SuppressWarnings("unused")
+public class GemstoneServiceImpl implements GemstoneService {
+
+ protected static final List APPROVED_GEMS = new ArrayList(Arrays.asList(
+ "ALEXANDRITE", "AQUAMARINE", "DIAMOND", "OPAL", "PEARL", "RUBY", "SAPPHIRE", "SPINEL", "TOPAZ"));
+
+ @Autowired
+ private GemstoneRepository gemstoneRepo;
+
+ @PostConstruct
+ public void init() {
+ Assert.notNull(gemstoneRepo, "A reference to the 'GemstoneRepository' was not properly configured!");
+ System.out.printf("%1$s initialized!%n", getClass().getSimpleName());
+ }
+
+ /**
+ * Returns a count of the number of Gemstones in the GemFire Cache.
+ *
+ *
+ * @return a long value indicating the number of Gemstones in the GemFire Cache.
+ */
+ @Transactional(readOnly = true)
+ public long count() {
+ return gemstoneRepo.count();
+ }
+
+ /**
+ * Gets a Gemstone by ID.
+ *
+ *
+ * @param id a long value indicating the identifier of the Gemstone.
+ * @return a Gemstone with ID, or null if no Gemstone exists with ID.
+ * @see sample.data.gemfire.domain.Gemstone
+ */
+ @Transactional(readOnly = true)
+ public Gemstone get(final Long id) {
+ return gemstoneRepo.findOne(id);
+ }
+
+ /**
+ * Gets a Gemstone by name.
+ *
+ *
+ * @param name a String value indicating the name of the Gemstone.
+ * @return a Gemstone with name, or null if no Gemstone exists with name.
+ * @see sample.data.gemfire.domain.Gemstone
+ */
+ @Transactional(readOnly = true)
+ public Gemstone get(final String name) {
+ return gemstoneRepo.findByName(name);
+ }
+
+ /**
+ * Return a listing of Gemstones currently stored in the GemFire Cache.
+ *
+ *
+ * @return a Iterable object to iterate over the list of Gemstones currently stored in the GemFire Cache.
+ * @see java.lang.Iterable
+ * @see sample.data.gemfire.domain.Gemstone
+ */
+ @Transactional(readOnly = true)
+ public Iterable list() {
+ return gemstoneRepo.findAll();
+ }
+
+ /**
+ * Saves the specified Gemstone to the GemFire Cache.
+ *
+ *
+ * @param gemstone the Gemstone to save in the GemFire Cache.
+ * @return the saved Gemstone.
+ * @see sample.data.gemfire.domain.Gemstone
+ */
+ @Transactional
+ public Gemstone save(final 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(gemstoneRepo.save(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());
+
+ return gemstone;
+ }
+
+ private Gemstone validate(final 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());
+ throw new IllegalGemstoneException(String.format("'%1$s' is not a valid Gemstone!", gemstone.getName()));
+ }
+
+ return gemstone;
+ }
+
+ public static final class IllegalGemstoneException extends IllegalArgumentException {
+
+ public IllegalGemstoneException() {
+ }
+
+ public IllegalGemstoneException(final String message) {
+ super(message);
+ }
+
+ public IllegalGemstoneException(final Throwable cause) {
+ super(cause);
+ }
+
+ public IllegalGemstoneException(final String message, final Throwable cause) {
+ super(message, cause);
+ }
+ }
+
+}
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
new file mode 100644
index 00000000000..59279236498
--- /dev/null
+++ b/spring-boot-samples/spring-boot-sample-data-gemfire/src/main/resources/spring-data-gemfire-cache.xml
@@ -0,0 +1,25 @@
+
+
+
+
+ GemstonesSpringGemFireApp
+ config
+ 0
+
+
+
+
+
+
+
+
+
diff --git a/spring-boot-samples/spring-boot-sample-data-gemfire/src/test/java/sample/data/gemfire/SampleDataGemFireApplicationTest.java b/spring-boot-samples/spring-boot-sample-data-gemfire/src/test/java/sample/data/gemfire/SampleDataGemFireApplicationTest.java
new file mode 100644
index 00000000000..ecfa616f9c9
--- /dev/null
+++ b/spring-boot-samples/spring-boot-sample-data-gemfire/src/test/java/sample/data/gemfire/SampleDataGemFireApplicationTest.java
@@ -0,0 +1,131 @@
+/*
+ * 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;
+
+import static org.junit.Assert.*;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.atomic.AtomicLong;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.SpringApplicationConfiguration;
+import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+
+import sample.data.gemfire.domain.Gemstone;
+import sample.data.gemfire.service.GemstoneService;
+import sample.data.gemfire.service.GemstoneServiceImpl.IllegalGemstoneException;
+
+/**
+ * The SampleDataGemFireApplicationTest class is a test suite with test cases testing the SampleDataGemFireApplication
+ * in Spring Boot.
+ *
+ * @author John Blum
+ * @see org.junit.Test
+ * @see org.junit.runner.RunWith
+ * @see org.springframework.boot.test.SpringApplicationConfiguration
+ * @see org.springframework.test.context.junit4.SpringJUnit4ClassRunner
+ * @see sample.data.gemfire.SampleDataGemFireApplication
+ * @since 1.0.0
+ */
+@RunWith(SpringJUnit4ClassRunner.class)
+@SpringApplicationConfiguration(classes = SampleDataGemFireApplication.class)
+@SuppressWarnings("unused")
+public class SampleDataGemFireApplicationTest {
+
+ @Autowired
+ private GemstoneService gemstoneService;
+
+ private final AtomicLong ID_GENERATOR = new AtomicLong(0l);
+
+ protected List asList(final Iterable gemstones) {
+ List gemstoneList = new ArrayList();
+
+ if (gemstones != null) {
+ for (Gemstone gemstone : gemstones) {
+ gemstoneList.add(gemstone);
+ }
+ }
+
+ return gemstoneList;
+ }
+
+ protected Gemstone createGemstone(final String name) {
+ return createGemstone(ID_GENERATOR.incrementAndGet(), name);
+ }
+
+ protected Gemstone createGemstone(final Long id, final String name) {
+ return new Gemstone(id, name);
+ }
+
+ protected List getGemstones(final String... names) {
+ List gemstones = new ArrayList(names.length);
+
+ for (String name : names) {
+ gemstones.add(createGemstone(null, name));
+ }
+
+ return gemstones;
+ }
+
+ @Before
+ public void setup() {
+ assertNotNull("A reference to the GemstoneService was not properly configured!", gemstoneService);
+ }
+
+ @Test
+ public void testGemstonesApp() {
+ assertEquals(0, gemstoneService.count());
+ assertTrue(asList(gemstoneService.list()).isEmpty());
+
+ gemstoneService.save(createGemstone("Diamond"));
+ gemstoneService.save(createGemstone("Ruby"));
+
+ assertEquals(2, gemstoneService.count());
+ assertTrue(asList(gemstoneService.list()).containsAll(getGemstones("Diamond", "Ruby")));
+
+ try {
+ gemstoneService.save(createGemstone("Coal"));
+ }
+ catch (IllegalGemstoneException expected) {
+ }
+
+ assertEquals(2, gemstoneService.count());
+ assertTrue(asList(gemstoneService.list()).containsAll(getGemstones("Diamond", "Ruby")));
+
+ gemstoneService.save(createGemstone("Pearl"));
+ gemstoneService.save(createGemstone("Sapphire"));
+
+ assertEquals(4, gemstoneService.count());
+ assertTrue(asList(gemstoneService.list()).containsAll(getGemstones("Diamond", "Ruby", "Pearl", "Sapphire")));
+
+ try {
+ gemstoneService.save(createGemstone("Quartz"));
+ }
+ catch (IllegalGemstoneException expected) {
+ }
+
+ assertEquals(4, gemstoneService.count());
+ assertTrue(asList(gemstoneService.list()).containsAll(getGemstones("Diamond", "Ruby", "Pearl", "Sapphire")));
+ assertEquals(createGemstone("Diamond"), gemstoneService.get("Diamond"));
+ assertEquals(createGemstone("Pearl"), gemstoneService.get("Pearl"));
+ }
+
+}
diff --git a/spring-boot-starters/pom.xml b/spring-boot-starters/pom.xml
index 0f30484737e..37b920174b3 100644
--- a/spring-boot-starters/pom.xml
+++ b/spring-boot-starters/pom.xml
@@ -25,6 +25,7 @@
spring-boot-starter-aop
spring-boot-starter-batch
spring-boot-starter-data-couchbase
+ spring-boot-starter-data-gemfire
spring-boot-starter-data-jpa
spring-boot-starter-data-mongodb
spring-boot-starter-integration
diff --git a/spring-boot-starters/spring-boot-starter-data-gemfire/pom.xml b/spring-boot-starters/spring-boot-starter-data-gemfire/pom.xml
new file mode 100644
index 00000000000..de24e1d2629
--- /dev/null
+++ b/spring-boot-starters/spring-boot-starter-data-gemfire/pom.xml
@@ -0,0 +1,42 @@
+
+
+ 4.0.0
+
+ org.springframework.boot
+ spring-boot-starters
+ 1.0.1.BUILD-SNAPSHOT
+
+ spring-boot-starter-data-gemfire
+ jar
+
+ ${basedir}/../..
+
+
+
+ ${project.groupId}
+ spring-boot-starter
+ ${project.version}
+
+
+ com.gemstone.gemfire
+ gemfire
+
+
+ org.springframework.data
+ spring-data-gemfire
+
+
+
+
+ spring-plugins
+ http://repo.spring.io/plugins-release
+
+ true
+
+
+ false
+
+
+
+
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
new file mode 100644
index 00000000000..52b4808d1d5
--- /dev/null
+++ b/spring-boot-starters/spring-boot-starter-data-gemfire/src/main/resources/META-INF/spring.provides
@@ -0,0 +1 @@
+provides: gemfire,spring-data-gemfire
diff --git a/spring-boot-starters/spring-boot-starter-parent/pom.xml b/spring-boot-starters/spring-boot-starter-parent/pom.xml
index 9248046a938..95779265d3c 100644
--- a/spring-boot-starters/spring-boot-starter-parent/pom.xml
+++ b/spring-boot-starters/spring-boot-starter-parent/pom.xml
@@ -76,6 +76,11 @@
spring-boot-starter-batch
${spring-boot.version}
+
+ org.springframework.boot
+ spring-boot-starter-data-gemfire
+ 1.0.0.BUILD-SNAPSHOT
+
org.springframework.boot
spring-boot-starter-data-jpa