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