Skip to content

Commit e6ec0a7

Browse files
author
Udo Kohlmeyer
committed
DATAGEODE-136 - Final Testing.
1 parent f23a46a commit e6ec0a7

12 files changed

+296
-290
lines changed

spring-data-geode/src/main/java/org/springframework/data/gemfire/config/annotation/EnableEventProcessing.java

-1
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,6 @@
2727
import org.springframework.context.annotation.Import;
2828
import org.springframework.data.gemfire.eventing.config.AsCacheListenerBeanPostProcessorRegistrar;
2929
import org.springframework.data.gemfire.eventing.config.AsCacheWriterBeanPostProcessorRegistrar;
30-
import org.springframework.data.gemfire.eventing.config.ComposableCacheWriterWrapper;
3130
import org.springframework.data.gemfire.eventing.config.PojoCacheListenerWrapper;
3231

3332
/**

spring-data-geode/src/main/java/org/springframework/data/gemfire/config/support/CacheWriterPostProcessor.java

+6-10
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,6 @@
3737
import org.springframework.data.gemfire.eventing.EventProcessorUtils;
3838
import org.springframework.data.gemfire.eventing.config.CacheWriterEventType;
3939
import org.springframework.data.gemfire.eventing.config.ComposableCacheWriterWrapper;
40-
import org.springframework.data.gemfire.eventing.config.ComposableRegionEventCacheWriterWrapper;
4140
import org.springframework.data.gemfire.eventing.config.RegionCacheWriterEventType;
4241

4342
/**
@@ -49,7 +48,6 @@
4948
public class CacheWriterPostProcessor extends CallbackPostProcessor {
5049

5150
private final Map<String, ComposableCacheWriterWrapper> composableCacheWriterWrappers = new HashMap<>();
52-
private final Map<String, ComposableRegionEventCacheWriterWrapper> composableRegionEventCacheWriterWrappers = new HashMap<>();
5351
private List<String> configuredRegions;
5452

5553
@Override
@@ -106,23 +104,21 @@ protected Class getEventHandlerClass() {
106104

107105
/**
108106
* Lookup {@link RegionCacheWriterEventType} from the {@link AsRegionEventHandler} annotation and
109-
* create a {@link ComposableRegionEventCacheWriterWrapper}
107+
* create a {@link ComposableCacheWriterWrapper}
110108
* of type {@link CacheWriter} that would register itself onto a {@link Region} for the configured
111109
* {@link Region} specific events
112110
*/
113111
private void registerRegionEventHandler(Object bean, Method method, RegionCacheWriterEventType[] eventTypes,
114112
String regionName) {
115-
ComposableRegionEventCacheWriterWrapper composableRegionEventCacheWriterWrapper =
116-
composableRegionEventCacheWriterWrappers
117-
.getOrDefault(regionName, new ComposableRegionEventCacheWriterWrapper());
113+
ComposableCacheWriterWrapper composableCacheWriterWrapper =
114+
composableCacheWriterWrappers.getOrDefault(regionName, new ComposableCacheWriterWrapper());
118115

119116
EventProcessorUtils.validateEventHandlerMethodParameters(method, RegionEvent.class);
120-
composableRegionEventCacheWriterWrapper.addCacheWriter(method, bean, eventTypes);
121-
registerEventHandlerToRegion(regionName, composableRegionEventCacheWriterWrapper);
117+
composableCacheWriterWrapper.addCacheWriter(method, bean, eventTypes);
122118

123-
composableRegionEventCacheWriterWrappers.put(regionName, composableRegionEventCacheWriterWrapper);
119+
composableCacheWriterWrappers.put(regionName, composableCacheWriterWrapper);
124120

125-
registerEventHandlerToRegion(regionName, composableRegionEventCacheWriterWrapper);
121+
registerEventHandlerToRegion(regionName, composableCacheWriterWrapper);
126122
}
127123

128124
/**
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,3 @@
1-
/*
2-
* Copyright 2016-2019 the original author or authors.
3-
*
4-
* Licensed under the Apache License, Version 2.0 (the "License");
5-
* you may not use this file except in compliance with the License.
6-
* You may obtain a copy of the License at
7-
*
8-
* https://www.apache.org/licenses/LICENSE-2.0
9-
*
10-
* Unless required by applicable law or agreed to in writing, software
11-
* distributed under the License is distributed on an "AS IS" BASIS,
12-
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13-
* See the License for the specific language governing permissions and
14-
* limitations under the License.
15-
*
16-
*/
17-
181
package org.springframework.data.gemfire.eventing.config;
192

203
import java.lang.reflect.Method;
@@ -23,43 +6,47 @@
236
import java.util.List;
247
import java.util.Map;
258

9+
import org.apache.geode.cache.CacheEvent;
10+
import org.apache.geode.cache.CacheWriterException;
2611
import org.apache.geode.cache.EntryEvent;
12+
import org.apache.geode.cache.RegionEvent;
2713
import org.apache.geode.cache.util.CacheWriterAdapter;
2814
import org.slf4j.Logger;
2915
import org.slf4j.LoggerFactory;
30-
import org.springframework.util.ReflectionUtils;
31-
32-
/**
33-
* Invokes a given {@link Object POJO} {@link Method} as a GemFire/Geode {@link org.apache.geode.cache.CacheWriter}.
34-
* This proxy will process events triggered from CRUD operations against the {@link org.apache.geode.cache.Region} data.
35-
*
36-
* @author Udo Kohlmeyer
37-
* @see org.apache.geode.cache.CacheWriter
38-
* @see org.apache.geode.cache.util.CacheWriterAdapter
39-
* @since 2.3.0
40-
*/
41-
public class ComposableCacheWriterWrapper extends CacheWriterAdapter {
16+
17+
public class ComposableCacheWriterWrapper<E extends Enum<E>> extends CacheWriterAdapter {
4218

4319
private static final String BEFORE_CREATE = "beforeCreate";
4420
private static final String BEFORE_UPDATE = "beforeUpdate";
4521
private static final String BEFORE_DESTROY = "beforeDestroy";
22+
private static final String BEFORE_REGION_DESTROY = "beforeRegionDestroy";
23+
private static final String BEFORE_REGION_CLEAR = "beforeRegionClear";
24+
25+
private static Logger logger = LoggerFactory.getLogger(ComposableCacheWriterWrapper.class);
4626

47-
private static transient Logger logger = LoggerFactory.getLogger(ComposableCacheWriterWrapper.class);
48-
private Map<Integer, List<CacheWriterWrapper>> cacheWriterWrapperList = new HashMap<>();
27+
protected Map<Integer, List<PojoCacheWriterWrapper>> cacheWriterWrapperList = new HashMap<>();
4928

50-
public void addCacheWriter(Method method, Object targetInvocationClass, CacheWriterEventType[] eventTypes) {
29+
public void addCacheWriter(Method method, Object targetInvocationClass, E[] eventTypes) {
5130
int eventMask = createRegionEventTypeMask(eventTypes);
52-
List<CacheWriterWrapper> cacheWriterList = cacheWriterWrapperList.getOrDefault(eventMask, new LinkedList<>());
31+
List<PojoCacheWriterWrapper> regionEventCacheWriterList = cacheWriterWrapperList
32+
.getOrDefault(eventMask, new LinkedList<>());
5333

54-
cacheWriterList.add(new CacheWriterWrapper(method, targetInvocationClass));
34+
regionEventCacheWriterList.add(new PojoCacheWriterWrapper(method, targetInvocationClass));
5535

56-
cacheWriterWrapperList.put(eventMask, cacheWriterList);
36+
cacheWriterWrapperList.put(eventMask, regionEventCacheWriterList);
5737
}
5838

59-
private static int createRegionEventTypeMask(CacheWriterEventType[] cacheWriterEventTypes) {
39+
public int createRegionEventTypeMask(E[] cacheWriterEventTypes) {
6040
int mask = 0x0;
61-
for (CacheWriterEventType eventType : cacheWriterEventTypes) {
62-
mask |= eventType.mask;
41+
for (E cacheWriterEventType : cacheWriterEventTypes) {
42+
if (cacheWriterEventType instanceof CacheWriterEventType) {
43+
CacheWriterEventType writerEventType = (CacheWriterEventType) cacheWriterEventType;
44+
mask |= writerEventType.mask;
45+
}
46+
else if (cacheWriterEventType instanceof RegionCacheWriterEventType) {
47+
RegionCacheWriterEventType writerEventType = (RegionCacheWriterEventType) cacheWriterEventType;
48+
mask |= writerEventType.mask;
49+
}
6350
}
6451
return mask;
6552
}
@@ -68,33 +55,45 @@ private static int createRegionEventTypeMask(CacheWriterEventType[] cacheWriterE
6855
public void beforeCreate(EntryEvent event) {
6956
logDebug(BEFORE_CREATE);
7057

71-
executeEventHandler(event, CacheWriterEventType.BEFORE_CREATE);
58+
executeEventHandler(event, CacheWriterEventType.BEFORE_CREATE.mask);
7259
}
7360

7461
@Override
7562
public void beforeUpdate(EntryEvent event) {
7663
logDebug(BEFORE_UPDATE);
7764

78-
executeEventHandler(event, CacheWriterEventType.BEFORE_UPDATE);
65+
executeEventHandler(event, CacheWriterEventType.BEFORE_UPDATE.mask);
7966
}
8067

8168
@Override
8269
public void beforeDestroy(EntryEvent event) {
8370
logDebug(BEFORE_DESTROY);
8471

85-
executeEventHandler(event, CacheWriterEventType.BEFORE_DESTROY);
72+
executeEventHandler(event, CacheWriterEventType.BEFORE_DESTROY.mask);
73+
}
74+
75+
@Override
76+
public void beforeRegionDestroy(RegionEvent event) throws CacheWriterException {
77+
logDebug(BEFORE_REGION_DESTROY);
78+
79+
executeEventHandler(event, RegionCacheWriterEventType.BEFORE_REGION_DESTROY.mask);
8680
}
8781

88-
private void executeEventHandler(EntryEvent event, CacheWriterEventType eventType) {
82+
@Override
83+
public void beforeRegionClear(RegionEvent event) throws CacheWriterException {
84+
logDebug(BEFORE_REGION_CLEAR);
85+
86+
executeEventHandler(event, RegionCacheWriterEventType.BEFORE_REGION_CLEAR.mask);
87+
}
8988

90-
for (Map.Entry<Integer, List<CacheWriterWrapper>> cacheWriterWrappers : cacheWriterWrapperList
89+
private void executeEventHandler(CacheEvent event, int eventTypeInt) {
90+
91+
for (Map.Entry<Integer, List<PojoCacheWriterWrapper>> cacheWriterWrappers : cacheWriterWrapperList
9192
.entrySet()) {
92-
if ((eventType.mask & cacheWriterWrappers.getKey()) == eventType.mask) {
93+
if ((cacheWriterWrappers.getKey() & eventTypeInt) == eventTypeInt) {
9394

94-
for (CacheWriterWrapper pojoCacheWriterWrapper : cacheWriterWrappers.getValue()) {
95-
ReflectionUtils
96-
.invokeMethod(pojoCacheWriterWrapper.method, pojoCacheWriterWrapper.targetInvocationObject,
97-
event);
95+
for (PojoCacheWriterWrapper pojoCacheWriterWrapper : cacheWriterWrappers.getValue()) {
96+
pojoCacheWriterWrapper.executeCacheWriter(event);
9897
}
9998
}
10099
}
@@ -105,15 +104,4 @@ private void logDebug(String eventType) {
105104
logger.debug("Invoking " + eventType);
106105
}
107106
}
108-
109-
private static class CacheWriterWrapper {
110-
111-
private final Method method;
112-
private final Object targetInvocationObject;
113-
114-
public CacheWriterWrapper(Method method, Object targetInvocationClass) {
115-
this.method = method;
116-
this.targetInvocationObject = targetInvocationClass;
117-
}
118-
}
119107
}

spring-data-geode/src/main/java/org/springframework/data/gemfire/eventing/config/ComposableRegionEventCacheWriterWrapper.java

-116
This file was deleted.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package org.springframework.data.gemfire.eventing.config;
2+
3+
import java.lang.reflect.Method;
4+
5+
import org.apache.geode.cache.CacheEvent;
6+
import org.springframework.util.ReflectionUtils;
7+
8+
public class PojoCacheWriterWrapper {
9+
10+
private final Method method;
11+
private final Object targetInvocationObject;
12+
13+
public PojoCacheWriterWrapper(Method method, Object targetInvocationClass) {
14+
this.method = method;
15+
this.targetInvocationObject = targetInvocationClass;
16+
}
17+
18+
public void executeCacheWriter(CacheEvent event) {
19+
ReflectionUtils
20+
.invokeMethod(method, targetInvocationObject, event);
21+
}
22+
}

spring-data-geode/src/main/java/org/springframework/data/gemfire/eventing/config/RegionCacheWriterEventType.java

+4-4
Original file line numberDiff line numberDiff line change
@@ -25,11 +25,11 @@
2525
* @since 2.3.0
2626
*/
2727
public enum RegionCacheWriterEventType {
28-
ALL(0b0000011),
29-
BEFORE_REGION_CLEAR(0b00000001),
30-
BEFORE_REGION_DESTROY(0b00000010);
28+
ALL(0b0011000),
29+
BEFORE_REGION_CLEAR(0b0001000),
30+
BEFORE_REGION_DESTROY(0b0010000);
3131

32-
RegionCacheWriterEventType(int mask){
32+
RegionCacheWriterEventType(int mask) {
3333
this.mask = mask;
3434
}
3535

0 commit comments

Comments
 (0)