mirror of
https://github.com/spring-projects/spring-boot.git
synced 2024-09-03 04:26:12 +08:00
Created a Spring Data GemFire Starter POM
... as well as a Spring Boot Sample Application with associated tests for demonstrating how to get started using both Spring Data GemFire and GemFire.
This commit is contained in:
parent
898698a681
commit
34cbe1e60b
@ -52,6 +52,7 @@
|
|||||||
<commons-dbcp.version>1.4</commons-dbcp.version>
|
<commons-dbcp.version>1.4</commons-dbcp.version>
|
||||||
<commons-pool.version>1.6</commons-pool.version>
|
<commons-pool.version>1.6</commons-pool.version>
|
||||||
<crashub.version>1.3.0-beta14</crashub.version>
|
<crashub.version>1.3.0-beta14</crashub.version>
|
||||||
|
<gemfire.version>7.0.1</gemfire.version>
|
||||||
<gradle.version>1.6</gradle.version>
|
<gradle.version>1.6</gradle.version>
|
||||||
<groovy.version>2.3.0-rc-1</groovy.version>
|
<groovy.version>2.3.0-rc-1</groovy.version>
|
||||||
<h2.version>1.3.175</h2.version>
|
<h2.version>1.3.175</h2.version>
|
||||||
@ -87,6 +88,7 @@
|
|||||||
<spring-integration.version>3.0.2.RELEASE</spring-integration.version>
|
<spring-integration.version>3.0.2.RELEASE</spring-integration.version>
|
||||||
<spring-batch.version>2.2.6.RELEASE</spring-batch.version>
|
<spring-batch.version>2.2.6.RELEASE</spring-batch.version>
|
||||||
<spring-data-couchbase.version>1.0.0.RELEASE</spring-data-couchbase.version>
|
<spring-data-couchbase.version>1.0.0.RELEASE</spring-data-couchbase.version>
|
||||||
|
<spring-data-gemfire.version>1.3.3.RELEASE</spring-data-gemfire.version>
|
||||||
<spring-data-redis.version>1.1.1.RELEASE</spring-data-redis.version>
|
<spring-data-redis.version>1.1.1.RELEASE</spring-data-redis.version>
|
||||||
<spring-data-releasetrain.version>Codd-SR2</spring-data-releasetrain.version>
|
<spring-data-releasetrain.version>Codd-SR2</spring-data-releasetrain.version>
|
||||||
<spring-hateoas.version>0.9.0.RELEASE</spring-hateoas.version>
|
<spring-hateoas.version>0.9.0.RELEASE</spring-hateoas.version>
|
||||||
@ -311,6 +313,11 @@
|
|||||||
<artifactId>jetty-annotations</artifactId>
|
<artifactId>jetty-annotations</artifactId>
|
||||||
<version>${jetty.version}</version>
|
<version>${jetty.version}</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.gemstone.gemfire</groupId>
|
||||||
|
<artifactId>gemfire</artifactId>
|
||||||
|
<version>${gemfire.version}</version>
|
||||||
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.hamcrest</groupId>
|
<groupId>org.hamcrest</groupId>
|
||||||
<artifactId>hamcrest-library</artifactId>
|
<artifactId>hamcrest-library</artifactId>
|
||||||
@ -525,7 +532,12 @@
|
|||||||
<artifactId>spring-batch-core</artifactId>
|
<artifactId>spring-batch-core</artifactId>
|
||||||
<version>${spring-batch.version}</version>
|
<version>${spring-batch.version}</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
|
<groupId>org.springframework.data</groupId>
|
||||||
|
<artifactId>spring-data-gemfire</artifactId>
|
||||||
|
<version>${spring-data-gemfire.version}</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
<groupId>org.springframework.data</groupId>
|
<groupId>org.springframework.data</groupId>
|
||||||
<artifactId>spring-data-releasetrain</artifactId>
|
<artifactId>spring-data-releasetrain</artifactId>
|
||||||
<version>${spring-data-releasetrain.version}</version>
|
<version>${spring-data-releasetrain.version}</version>
|
||||||
|
@ -217,7 +217,7 @@
|
|||||||
<enabled>false</enabled>
|
<enabled>false</enabled>
|
||||||
</snapshots>
|
</snapshots>
|
||||||
</repository>
|
</repository>
|
||||||
</repositories>
|
</repositories>
|
||||||
<build>
|
<build>
|
||||||
<pluginManagement>
|
<pluginManagement>
|
||||||
<plugins>
|
<plugins>
|
||||||
|
@ -27,6 +27,7 @@
|
|||||||
<module>spring-boot-sample-amqp</module>
|
<module>spring-boot-sample-amqp</module>
|
||||||
<module>spring-boot-sample-aop</module>
|
<module>spring-boot-sample-aop</module>
|
||||||
<module>spring-boot-sample-batch</module>
|
<module>spring-boot-sample-batch</module>
|
||||||
|
<module>spring-boot-sample-data-gemfire</module>
|
||||||
<module>spring-boot-sample-data-jpa</module>
|
<module>spring-boot-sample-data-jpa</module>
|
||||||
<module>spring-boot-sample-data-mongodb</module>
|
<module>spring-boot-sample-data-mongodb</module>
|
||||||
<module>spring-boot-sample-data-redis</module>
|
<module>spring-boot-sample-data-redis</module>
|
||||||
|
39
spring-boot-samples/spring-boot-sample-data-gemfire/pom.xml
Normal file
39
spring-boot-samples/spring-boot-sample-data-gemfire/pom.xml
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||||
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
<parent>
|
||||||
|
<!-- Your own application should inherit from spring-boot-starter-parent -->
|
||||||
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
<artifactId>spring-boot-samples</artifactId>
|
||||||
|
<version>1.0.1.BUILD-SNAPSHOT</version>
|
||||||
|
</parent>
|
||||||
|
<artifactId>spring-boot-sample-data-gemfire</artifactId>
|
||||||
|
<packaging>jar</packaging>
|
||||||
|
<properties>
|
||||||
|
<main.basedir>${basedir}/../..</main.basedir>
|
||||||
|
</properties>
|
||||||
|
<dependencies>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
<artifactId>spring-boot-starter</artifactId>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
<artifactId>spring-boot-starter-data-gemfire</artifactId>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
<artifactId>spring-boot-starter-test</artifactId>
|
||||||
|
<scope>test</scope>
|
||||||
|
</dependency>
|
||||||
|
</dependencies>
|
||||||
|
<build>
|
||||||
|
<plugins>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
<artifactId>spring-boot-maven-plugin</artifactId>
|
||||||
|
</plugin>
|
||||||
|
</plugins>
|
||||||
|
</build>
|
||||||
|
</project>
|
@ -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.
|
||||||
|
* <p/>
|
||||||
|
* @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);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -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.
|
||||||
|
* <p/>
|
||||||
|
* @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());
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -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.
|
||||||
|
* <p/>
|
||||||
|
* @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<Gemstone, Long> {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Finds a particular Gemstone in the GemFire Cache by name.
|
||||||
|
* <p/>
|
||||||
|
*
|
||||||
|
* @param <T> 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 extends Gemstone> T findByName(String name);
|
||||||
|
|
||||||
|
}
|
@ -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.
|
||||||
|
* <p/>
|
||||||
|
* @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.
|
||||||
|
* <p/>
|
||||||
|
*
|
||||||
|
* @return a long value indicating the number of Gemstones in the GemFire Cache.
|
||||||
|
*/
|
||||||
|
long count();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets a Gemstone by ID.
|
||||||
|
* <p/>
|
||||||
|
*
|
||||||
|
* @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.
|
||||||
|
* <p/>
|
||||||
|
*
|
||||||
|
* @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.
|
||||||
|
* <p/>
|
||||||
|
*
|
||||||
|
* @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<Gemstone> list();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Saves the specified Gemstone to the GemFire Cache.
|
||||||
|
* <p/>
|
||||||
|
*
|
||||||
|
* @param gemstone the Gemstone to save in the GemFire Cache.
|
||||||
|
* @return the saved Gemstone.
|
||||||
|
* @see sample.data.gemfire.domain.Gemstone
|
||||||
|
*/
|
||||||
|
Gemstone save(Gemstone gemstone);
|
||||||
|
|
||||||
|
}
|
@ -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.
|
||||||
|
* <p/>
|
||||||
|
* @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<String> APPROVED_GEMS = new ArrayList<String>(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.
|
||||||
|
* <p/>
|
||||||
|
*
|
||||||
|
* @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.
|
||||||
|
* <p/>
|
||||||
|
*
|
||||||
|
* @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.
|
||||||
|
* <p/>
|
||||||
|
*
|
||||||
|
* @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.
|
||||||
|
* <p/>
|
||||||
|
*
|
||||||
|
* @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<Gemstone> list() {
|
||||||
|
return gemstoneRepo.findAll();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Saves the specified Gemstone to the GemFire Cache.
|
||||||
|
* <p/>
|
||||||
|
*
|
||||||
|
* @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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,25 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<beans xmlns="http://www.springframework.org/schema/beans"
|
||||||
|
xmlns:gfe="http://www.springframework.org/schema/gemfire"
|
||||||
|
xmlns:util="http://www.springframework.org/schema/util"
|
||||||
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
|
xsi:schemaLocation="
|
||||||
|
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
|
||||||
|
http://www.springframework.org/schema/gemfire http://www.springframework.org/schema/gemfire/spring-gemfire.xsd
|
||||||
|
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd
|
||||||
|
">
|
||||||
|
|
||||||
|
<util:properties id="gemfireCacheConfigurationSettings">
|
||||||
|
<prop key="name">GemstonesSpringGemFireApp</prop>
|
||||||
|
<prop key="log-level">config</prop>
|
||||||
|
<prop key="mcast-port">0</prop>
|
||||||
|
</util:properties>
|
||||||
|
|
||||||
|
<gfe:cache properties-ref="gemfireCacheConfigurationSettings"/>
|
||||||
|
|
||||||
|
<gfe:replicated-region id="Gemstones" ignore-jta="true" persistent="false"
|
||||||
|
key-constraint="java.lang.Long" value-constraint="sample.data.gemfire.domain.Gemstone"/>
|
||||||
|
|
||||||
|
<gfe:transaction-manager id="transactionManager" copy-on-read="true"/>
|
||||||
|
|
||||||
|
</beans>
|
@ -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.
|
||||||
|
* <p/>
|
||||||
|
* @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<Gemstone> asList(final Iterable<Gemstone> gemstones) {
|
||||||
|
List<Gemstone> gemstoneList = new ArrayList<Gemstone>();
|
||||||
|
|
||||||
|
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<Gemstone> getGemstones(final String... names) {
|
||||||
|
List<Gemstone> gemstones = new ArrayList<Gemstone>(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"));
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -25,6 +25,7 @@
|
|||||||
<module>spring-boot-starter-aop</module>
|
<module>spring-boot-starter-aop</module>
|
||||||
<module>spring-boot-starter-batch</module>
|
<module>spring-boot-starter-batch</module>
|
||||||
<module>spring-boot-starter-data-couchbase</module>
|
<module>spring-boot-starter-data-couchbase</module>
|
||||||
|
<module>spring-boot-starter-data-gemfire</module>
|
||||||
<module>spring-boot-starter-data-jpa</module>
|
<module>spring-boot-starter-data-jpa</module>
|
||||||
<module>spring-boot-starter-data-mongodb</module>
|
<module>spring-boot-starter-data-mongodb</module>
|
||||||
<module>spring-boot-starter-integration</module>
|
<module>spring-boot-starter-integration</module>
|
||||||
|
@ -0,0 +1,42 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||||
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
<parent>
|
||||||
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
<artifactId>spring-boot-starters</artifactId>
|
||||||
|
<version>1.0.1.BUILD-SNAPSHOT</version>
|
||||||
|
</parent>
|
||||||
|
<artifactId>spring-boot-starter-data-gemfire</artifactId>
|
||||||
|
<packaging>jar</packaging>
|
||||||
|
<properties>
|
||||||
|
<main.basedir>${basedir}/../..</main.basedir>
|
||||||
|
</properties>
|
||||||
|
<dependencies>
|
||||||
|
<dependency>
|
||||||
|
<groupId>${project.groupId}</groupId>
|
||||||
|
<artifactId>spring-boot-starter</artifactId>
|
||||||
|
<version>${project.version}</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.gemstone.gemfire</groupId>
|
||||||
|
<artifactId>gemfire</artifactId>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework.data</groupId>
|
||||||
|
<artifactId>spring-data-gemfire</artifactId>
|
||||||
|
</dependency>
|
||||||
|
</dependencies>
|
||||||
|
<repositories>
|
||||||
|
<repository>
|
||||||
|
<id>spring-plugins</id>
|
||||||
|
<url>http://repo.spring.io/plugins-release</url>
|
||||||
|
<releases>
|
||||||
|
<enabled>true</enabled>
|
||||||
|
</releases>
|
||||||
|
<snapshots>
|
||||||
|
<enabled>false</enabled>
|
||||||
|
</snapshots>
|
||||||
|
</repository>
|
||||||
|
</repositories>
|
||||||
|
</project>
|
@ -0,0 +1 @@
|
|||||||
|
provides: gemfire,spring-data-gemfire
|
@ -76,6 +76,11 @@
|
|||||||
<artifactId>spring-boot-starter-batch</artifactId>
|
<artifactId>spring-boot-starter-batch</artifactId>
|
||||||
<version>${spring-boot.version}</version>
|
<version>${spring-boot.version}</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
<artifactId>spring-boot-starter-data-gemfire</artifactId>
|
||||||
|
<version>1.0.0.BUILD-SNAPSHOT</version>
|
||||||
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.springframework.boot</groupId>
|
<groupId>org.springframework.boot</groupId>
|
||||||
<artifactId>spring-boot-starter-data-jpa</artifactId>
|
<artifactId>spring-boot-starter-data-jpa</artifactId>
|
||||||
|
Loading…
Reference in New Issue
Block a user