Skip to content

Commit 4ba3dd6

Browse files
committed
feat: ensure consistency of called CrrTransmitCallback instances of a CompositeCrrTransmitCallback process
1 parent d4c0346 commit 4ba3dd6

File tree

2 files changed

+55
-41
lines changed

2 files changed

+55
-41
lines changed

ttl-core/src/main/java/com/alibaba/crr/composite/CompositeCrrTransmit.java

Lines changed: 23 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package com.alibaba.crr.composite;
22

33
import com.alibaba.crr.CrrTransmit;
4-
import com.alibaba.crr.CrrTransmitCallback;
54
import edu.umd.cs.findbugs.annotations.NonNull;
65

76
import java.util.HashMap;
@@ -24,14 +23,14 @@
2423
*
2524
* @author Jerry Lee (oldratlee at gmail dot com)
2625
*/
27-
public class CompositeCrrTransmit implements CrrTransmit<Capture, Backup> {
26+
public final class CompositeCrrTransmit implements CrrTransmit<Capture, Backup> {
2827
private static final Logger logger = Logger.getLogger(CompositeCrrTransmit.class.getName());
2928

3029
private final Set<CrrTransmit<Object, Object>> registeredCrrTransmitSet = new CopyOnWriteArraySet<>();
3130

32-
private final CrrTransmitCallback callback;
31+
private final CompositeCrrTransmitCallback callback;
3332

34-
public CompositeCrrTransmit(CrrTransmitCallback callback) {
33+
public CompositeCrrTransmit(CompositeCrrTransmitCallback callback) {
3534
this.callback = callback;
3635
}
3736

@@ -53,7 +52,7 @@ public Capture capture() {
5352
}
5453
}
5554
}
56-
return new Snapshot(crrTransmit2Value);
55+
return new Snapshot(crrTransmit2Value, null);
5756
}
5857

5958
/**
@@ -66,9 +65,9 @@ public Capture capture() {
6665
*/
6766
@NonNull
6867
public Backup replay(@NonNull Capture captured) {
69-
callback.beforeReplay();
70-
final Snapshot capturedSnapshot = (Snapshot) captured;
68+
final Object data = callback.beforeReplay();
7169

70+
final Snapshot capturedSnapshot = (Snapshot) captured;
7271
final HashMap<CrrTransmit<Object, Object>, Object> crrTransmit2Value = new HashMap<>(capturedSnapshot.crrTransmit2Value.size());
7372
for (Map.Entry<CrrTransmit<Object, Object>, Object> entry : capturedSnapshot.crrTransmit2Value.entrySet()) {
7473
CrrTransmit<Object, Object> crrTransmit = entry.getKey();
@@ -82,8 +81,9 @@ public Backup replay(@NonNull Capture captured) {
8281
}
8382
}
8483
}
85-
callback.afterReplay();
86-
return new Snapshot(crrTransmit2Value);
84+
85+
final Object afterData = callback.afterReplay(data);
86+
return new Snapshot(crrTransmit2Value, afterData);
8787
}
8888

8989
/**
@@ -103,7 +103,8 @@ public Backup replay(@NonNull Capture captured) {
103103
*/
104104
@NonNull
105105
public Backup clear() {
106-
callback.beforeReplay();
106+
final Object data = callback.beforeReplay();
107+
107108
final HashMap<CrrTransmit<Object, Object>, Object> crrTransmit2Value = new HashMap<>(registeredCrrTransmitSet.size());
108109
for (CrrTransmit<Object, Object> crrTransmit : registeredCrrTransmitSet) {
109110
try {
@@ -115,8 +116,9 @@ public Backup clear() {
115116
}
116117
}
117118
}
118-
callback.afterReplay();
119-
return new Snapshot(crrTransmit2Value);
119+
120+
final Object afterData = callback.afterReplay(data);
121+
return new Snapshot(crrTransmit2Value, afterData);
120122
}
121123

122124
/**
@@ -127,8 +129,10 @@ public Backup clear() {
127129
* @see #clear()
128130
*/
129131
public void restore(@NonNull Backup backup) {
130-
callback.beforeRestore();
131-
for (Map.Entry<CrrTransmit<Object, Object>, Object> entry : ((Snapshot) backup).crrTransmit2Value.entrySet()) {
132+
final Snapshot snapshot = (Snapshot) backup;
133+
final Object data = callback.beforeRestore(snapshot.data);
134+
135+
for (Map.Entry<CrrTransmit<Object, Object>, Object> entry : snapshot.crrTransmit2Value.entrySet()) {
132136
CrrTransmit<Object, Object> crrTransmit = entry.getKey();
133137
try {
134138
Object transmitBackup = entry.getValue();
@@ -140,14 +144,17 @@ public void restore(@NonNull Backup backup) {
140144
}
141145
}
142146
}
143-
callback.afterRestore();
147+
148+
callback.afterRestore(data);
144149
}
145150

146151
private static class Snapshot implements Capture, Backup {
147152
final HashMap<CrrTransmit<Object, Object>, Object> crrTransmit2Value;
153+
final Object data;
148154

149-
Snapshot(HashMap<CrrTransmit<Object, Object>, Object> crrTransmit2Value) {
155+
Snapshot(HashMap<CrrTransmit<Object, Object>, Object> crrTransmit2Value, Object data) {
150156
this.crrTransmit2Value = crrTransmit2Value;
157+
this.data = data;
151158
}
152159
}
153160

ttl-core/src/main/java/com/alibaba/crr/composite/CompositeCrrTransmitCallback.java

Lines changed: 32 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import com.alibaba.crr.CrrTransmitCallback;
44
import edu.umd.cs.findbugs.annotations.NonNull;
55

6+
import java.util.HashSet;
67
import java.util.Set;
78
import java.util.concurrent.CopyOnWriteArraySet;
89
import java.util.logging.Level;
@@ -14,62 +15,68 @@
1415
* @author Jerry Lee (oldratlee at gmail dot com)
1516
* @see CrrTransmitCallback
1617
*/
17-
public class CompositeCrrTransmitCallback implements CrrTransmitCallback {
18+
public final class CompositeCrrTransmitCallback {
1819
private static final Logger logger = Logger.getLogger(CompositeCrrTransmitCallback.class.getName());
1920

2021
private final Set<CrrTransmitCallback> registeredCrrTransmitCallbackSet = new CopyOnWriteArraySet<>();
2122

22-
@Override
23-
public void beforeReplay() {
24-
for (CrrTransmitCallback callback : registeredCrrTransmitCallbackSet) {
23+
Object beforeReplay() {
24+
Set<CrrTransmitCallback> callbacks = new HashSet<>(registeredCrrTransmitCallbackSet);
25+
for (CrrTransmitCallback cb : callbacks) {
2526
try {
26-
callback.beforeReplay();
27+
cb.beforeReplay();
2728
} catch (Throwable t) {
2829
if (logger.isLoggable(Level.WARNING)) {
29-
logger.log(Level.WARNING, "exception when beforeReplay for crrTransmitCallback " + callback +
30-
"(class " + callback.getClass().getName() + "), just ignored; cause: " + t, t);
30+
logger.log(Level.WARNING, "exception when beforeReplay for crrTransmitCallback " + cb +
31+
"(class " + cb.getClass().getName() + "), just ignored; cause: " + t, t);
3132
}
3233
}
3334
}
35+
return callbacks;
3436
}
3537

36-
@Override
37-
public void afterReplay() {
38-
for (CrrTransmitCallback callback : registeredCrrTransmitCallbackSet) {
38+
Object afterReplay(Object data) {
39+
@SuppressWarnings("unchecked")
40+
Set<CrrTransmitCallback> callbacks = (Set<CrrTransmitCallback>) data;
41+
for (CrrTransmitCallback cb : callbacks) {
3942
try {
40-
callback.afterReplay();
43+
cb.afterReplay();
4144
} catch (Throwable t) {
4245
if (logger.isLoggable(Level.WARNING)) {
43-
logger.log(Level.WARNING, "exception when afterReplay for crrTransmitCallback " + callback +
44-
"(class " + callback.getClass().getName() + "), just ignored; cause: " + t, t);
46+
logger.log(Level.WARNING, "exception when afterReplay for crrTransmitCallback " + cb +
47+
"(class " + cb.getClass().getName() + "), just ignored; cause: " + t, t);
4548
}
4649
}
4750
}
51+
return data;
4852
}
4953

50-
@Override
51-
public void beforeRestore() {
52-
for (CrrTransmitCallback callback : registeredCrrTransmitCallbackSet) {
54+
Object beforeRestore(Object data) {
55+
@SuppressWarnings("unchecked")
56+
Set<CrrTransmitCallback> callbacks = (Set<CrrTransmitCallback>) data;
57+
for (CrrTransmitCallback cb : callbacks) {
5358
try {
54-
callback.beforeRestore();
59+
cb.beforeRestore();
5560
} catch (Throwable t) {
5661
if (logger.isLoggable(Level.WARNING)) {
57-
logger.log(Level.WARNING, "exception when beforeRestore for crrTransmitCallback " + callback +
58-
"(class " + callback.getClass().getName() + "), just ignored; cause: " + t, t);
62+
logger.log(Level.WARNING, "exception when beforeRestore for crrTransmitCallback " + cb +
63+
"(class " + cb.getClass().getName() + "), just ignored; cause: " + t, t);
5964
}
6065
}
6166
}
67+
return data;
6268
}
6369

64-
@Override
65-
public void afterRestore() {
66-
for (CrrTransmitCallback callback : registeredCrrTransmitCallbackSet) {
70+
void afterRestore(Object data) {
71+
@SuppressWarnings("unchecked")
72+
Set<CrrTransmitCallback> callbacks = (Set<CrrTransmitCallback>) data;
73+
for (CrrTransmitCallback cb : callbacks) {
6774
try {
68-
callback.afterRestore();
75+
cb.afterRestore();
6976
} catch (Throwable t) {
7077
if (logger.isLoggable(Level.WARNING)) {
71-
logger.log(Level.WARNING, "exception when afterRestore for crrTransmitCallback " + callback +
72-
"(class " + callback.getClass().getName() + "), just ignored; cause: " + t, t);
78+
logger.log(Level.WARNING, "exception when afterRestore for crrTransmitCallback " + cb +
79+
"(class " + cb.getClass().getName() + "), just ignored; cause: " + t, t);
7380
}
7481
}
7582
}

0 commit comments

Comments
 (0)