SGF-404 - Enable Expiration settings and policies to be specified per application domain object using an @Expiration annotation and a custom, SDG-provided CustomExpiry instance.

Final touches on the SDG Expiration annotation based support.  Added additional test cases to test the improper specification of Expiration annotation attribute settings and modified the SDG Reference Guide to discuss Spring Property Placeholder and SpEL support.
(cherry picked from commit 278af87703dfbc341fef1690e7064d9de80fc295)

Signed-off-by: John Blum <jblum@pivotal.io>
This commit is contained in:
John Blum
2015-07-31 13:41:11 -07:00
parent 6264b93c7d
commit fc3519a080
2 changed files with 122 additions and 17 deletions

View File

@@ -19,6 +19,7 @@ package org.springframework.data.gemfire.support;
import static org.hamcrest.CoreMatchers.equalTo;
import static org.hamcrest.CoreMatchers.instanceOf;
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.CoreMatchers.isA;
import static org.hamcrest.CoreMatchers.not;
import static org.hamcrest.CoreMatchers.nullValue;
import static org.hamcrest.CoreMatchers.sameInstance;
@@ -29,11 +30,14 @@ import static org.mockito.Mockito.when;
import javax.annotation.Resource;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ExpectedException;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.data.gemfire.test.GemfireTestApplicationContextInitializer;
import org.springframework.expression.EvaluationException;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
@@ -65,6 +69,9 @@ import com.gemstone.gemfire.cache.Region;
@SuppressWarnings("unused")
public class AnnotationBasedExpirationConfigurationIntegrationTest {
@Rule
public ExpectedException expectedException = ExpectedException.none();
@Autowired
@Qualifier("genericExpiration")
private AnnotationBasedExpiration<Object, Object> genericExpiration;
@@ -125,7 +132,7 @@ public class AnnotationBasedExpirationConfigurationIntegrationTest {
public void exampleRegionIdleTimeoutExpirationPolicy() {
CustomExpiry<Object, Object> expiration = example.getAttributes().getCustomEntryIdleTimeout();
assertExpiration(expiration.getExpiry(mockRegionEntry(new ApplicationDomainObjectWithTimeToLiveGenericExpirationPolicies())),
assertExpiration(expiration.getExpiry(mockRegionEntry(new ApplicationDomainObjectWithTimeToLiveAndGenericExpirationPolicies())),
60, ExpirationAction.INVALIDATE);
assertExpiration(expiration.getExpiry(mockRegionEntry(new ApplicationDomainObjectWithIdleTimeoutExpirationPolicy())),
120, ExpirationAction.INVALIDATE);
@@ -143,7 +150,7 @@ public class AnnotationBasedExpirationConfigurationIntegrationTest {
public void exampleRegionTimeToLiveExpirationPolicy() {
CustomExpiry<Object, Object> expiration = example.getAttributes().getCustomEntryTimeToLive();
assertExpiration(expiration.getExpiry(mockRegionEntry(new ApplicationDomainObjectWithTimeToLiveGenericExpirationPolicies())),
assertExpiration(expiration.getExpiry(mockRegionEntry(new ApplicationDomainObjectWithTimeToLiveAndGenericExpirationPolicies())),
300, ExpirationAction.DESTROY);
assertExpiration(defaultExpirationAttributes, expiration.getExpiry(mockRegionEntry(new ApplicationDomainObjectWithIdleTimeoutExpirationPolicy())));
assertExpiration(expiration.getExpiry(mockRegionEntry(new ApplicationDomainObjectWithGenericExpirationPolicy())),
@@ -159,7 +166,7 @@ public class AnnotationBasedExpirationConfigurationIntegrationTest {
@Test
public void genericExpirationPolicy() {
assertExpiration(genericExpiration.getExpiry(mockRegionEntry(
new ApplicationDomainObjectWithTimeToLiveGenericExpirationPolicies())), 60, ExpirationAction.INVALIDATE);
new ApplicationDomainObjectWithTimeToLiveAndGenericExpirationPolicies())), 60, ExpirationAction.INVALIDATE);
assertThat(genericExpiration.getExpiry(mockRegionEntry(
new ApplicationDomainObjectWithIdleTimeoutExpirationPolicy())), is(nullValue()));
assertExpiration(genericExpiration.getExpiry(mockRegionEntry(
@@ -174,9 +181,25 @@ public class AnnotationBasedExpirationConfigurationIntegrationTest {
new RegionEntryGenericExpirationPolicy())), 60, ExpirationAction.DESTROY);
}
@Test
public void invalidExpirationAction() {
expectedException.expect(EvaluationException.class);
expectedException.expectCause(isA(IllegalArgumentException.class));
expectedException.expectMessage(String.format("'%1$s' is not resolvable as a valid ExpirationAction(Type)",
"@expirationProperties['gemfire.region.entry.expiration.invalid.action.string']"));
genericExpiration.getExpiry(mockRegionEntry(new RegionEntryWithInvalidExpirationAction()));
}
@Test
public void invalidExpirationTimeout() {
expectedException.expect(IllegalArgumentException.class);
expectedException.expectCause(is(nullValue(Throwable.class)));
genericExpiration.getExpiry(mockRegionEntry(new RegionEntryWithInvalidExpirationTimeout()));
}
@Expiration(timeout = "60", action = "INVALIDATE")
@TimeToLiveExpiration(timeout = "300", action = "DESTROY")
protected static class ApplicationDomainObjectWithTimeToLiveGenericExpirationPolicies {
protected static class ApplicationDomainObjectWithTimeToLiveAndGenericExpirationPolicies {
}
@IdleTimeoutExpiration(timeout = "120", action = "INVALIDATE")
@@ -205,4 +228,14 @@ public class AnnotationBasedExpirationConfigurationIntegrationTest {
protected static class RegionEntryGenericExpirationPolicy {
}
@Expiration(timeout = "${gemfire.region.entry.expiration.timeout}",
action = "@expirationProperties['gemfire.region.entry.expiration.invalid.action.string']")
protected static class RegionEntryWithInvalidExpirationAction {
}
@Expiration(timeout = "${gemfire.region.entry.expiration.invalid.timeout}",
action = "@expirationProperties['gemfire.region.entry.expiration.action.spring.type']")
protected static class RegionEntryWithInvalidExpirationTimeout {
}
}