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 @@ |
|||||||
|
<?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")); |
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
@ -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 |
||||||
Loading…
Reference in new issue