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
-
18
1
package org .springframework .data .gemfire .eventing .config ;
19
2
20
3
import java .lang .reflect .Method ;
23
6
import java .util .List ;
24
7
import java .util .Map ;
25
8
9
+ import org .apache .geode .cache .CacheEvent ;
10
+ import org .apache .geode .cache .CacheWriterException ;
26
11
import org .apache .geode .cache .EntryEvent ;
12
+ import org .apache .geode .cache .RegionEvent ;
27
13
import org .apache .geode .cache .util .CacheWriterAdapter ;
28
14
import org .slf4j .Logger ;
29
15
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 {
42
18
43
19
private static final String BEFORE_CREATE = "beforeCreate" ;
44
20
private static final String BEFORE_UPDATE = "beforeUpdate" ;
45
21
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 );
46
26
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 <>();
49
28
50
- public void addCacheWriter (Method method , Object targetInvocationClass , CacheWriterEventType [] eventTypes ) {
29
+ public void addCacheWriter (Method method , Object targetInvocationClass , E [] eventTypes ) {
51
30
int eventMask = createRegionEventTypeMask (eventTypes );
52
- List <CacheWriterWrapper > cacheWriterList = cacheWriterWrapperList .getOrDefault (eventMask , new LinkedList <>());
31
+ List <PojoCacheWriterWrapper > regionEventCacheWriterList = cacheWriterWrapperList
32
+ .getOrDefault (eventMask , new LinkedList <>());
53
33
54
- cacheWriterList .add (new CacheWriterWrapper (method , targetInvocationClass ));
34
+ regionEventCacheWriterList .add (new PojoCacheWriterWrapper (method , targetInvocationClass ));
55
35
56
- cacheWriterWrapperList .put (eventMask , cacheWriterList );
36
+ cacheWriterWrapperList .put (eventMask , regionEventCacheWriterList );
57
37
}
58
38
59
- private static int createRegionEventTypeMask (CacheWriterEventType [] cacheWriterEventTypes ) {
39
+ public int createRegionEventTypeMask (E [] cacheWriterEventTypes ) {
60
40
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
+ }
63
50
}
64
51
return mask ;
65
52
}
@@ -68,33 +55,45 @@ private static int createRegionEventTypeMask(CacheWriterEventType[] cacheWriterE
68
55
public void beforeCreate (EntryEvent event ) {
69
56
logDebug (BEFORE_CREATE );
70
57
71
- executeEventHandler (event , CacheWriterEventType .BEFORE_CREATE );
58
+ executeEventHandler (event , CacheWriterEventType .BEFORE_CREATE . mask );
72
59
}
73
60
74
61
@ Override
75
62
public void beforeUpdate (EntryEvent event ) {
76
63
logDebug (BEFORE_UPDATE );
77
64
78
- executeEventHandler (event , CacheWriterEventType .BEFORE_UPDATE );
65
+ executeEventHandler (event , CacheWriterEventType .BEFORE_UPDATE . mask );
79
66
}
80
67
81
68
@ Override
82
69
public void beforeDestroy (EntryEvent event ) {
83
70
logDebug (BEFORE_DESTROY );
84
71
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 );
86
80
}
87
81
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
+ }
89
88
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
91
92
.entrySet ()) {
92
- if ((eventType . mask & cacheWriterWrappers .getKey ()) == eventType . mask ) {
93
+ if ((cacheWriterWrappers .getKey () & eventTypeInt ) == eventTypeInt ) {
93
94
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 );
98
97
}
99
98
}
100
99
}
@@ -105,15 +104,4 @@ private void logDebug(String eventType) {
105
104
logger .debug ("Invoking " + eventType );
106
105
}
107
106
}
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
- }
119
107
}
0 commit comments