Browse Source
... as well as a Spring Boot Sample Application with associated tests for demonstrating how to get started using both Spring Data GemFire and GemFire.pull/746/head
15 changed files with 698 additions and 2 deletions
@ -0,0 +1,39 @@
@@ -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 @@
@@ -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 @@
@@ -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 @@
@@ -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 @@
@@ -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 @@
@@ -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 @@
@@ -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 @@
@@ -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")); |
||||
} |
||||
|
||||
} |
||||
@ -0,0 +1,42 @@
@@ -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 @@
@@ -0,0 +1 @@
|
||||
provides: gemfire,spring-data-gemfire |
||||
Loading…
Reference in new issue