18
18
19
19
import java .util .ArrayList ;
20
20
import java .util .HashMap ;
21
+ import java .util .Iterator ;
21
22
import java .util .List ;
22
23
import java .util .Map ;
24
+ import java .util .Map .Entry ;
23
25
26
+ import org .springframework .cloud .stream .binder .BinderHeaders ;
24
27
import org .springframework .messaging .Message ;
25
28
import org .springframework .messaging .MessageHeaders ;
26
29
import org .springframework .messaging .support .MessageBuilder ;
30
+ import org .springframework .util .Assert ;
27
31
28
32
/**
29
33
* @author Oleg Zhurakousky
30
34
* @since 4.2
31
35
*/
32
- public class StandardBatchUtils {
36
+ public final class StandardBatchUtils {
33
37
34
- public static String BATCH_HEADERS = "scst_batchHeaders" ;
38
+ private StandardBatchUtils () {
39
+
40
+ }
35
41
42
+ /**
43
+ * Iterates over batch message structure returning {@link Iterable} of individual messages.
44
+ *
45
+ * @param batchMessage instance of batch {@link Message}
46
+ * @return instance of {@link Iterable} representing individual Messages in a batch {@link Message} as {@link Entry}.
47
+ */
48
+ public static Iterable <Entry <Object , Map <String , Object >>> iterate (Message <List <Object >> batchMessage ) {
49
+ return new Iterable <Map .Entry <Object ,Map <String , Object >>>() {
50
+ @ Override
51
+ public Iterator <Entry <Object , Map <String , Object >>> iterator () {
52
+ return new Iterator <Entry <Object , Map <String , Object >>>() {
53
+ int index = 0 ;
54
+ @ Override
55
+ public Entry <Object , Map <String , Object >> next () {
56
+ return getMessageByIndex (batchMessage , index ++);
57
+ }
58
+
59
+ @ Override
60
+ public boolean hasNext () {
61
+ return index < batchMessage .getPayload ().size ();
62
+ }
63
+ };
64
+ }
65
+ };
66
+ }
67
+
68
+ /**
69
+ * Extracts individual {@link Message} by index from batch {@link Message}
70
+ * @param batchMessage instance of batch {@link Message}
71
+ * @param index index of individual {@link Message} in a batch
72
+ * @return individual {@link Message} in a batch {@link Message}
73
+ */
74
+ public static Entry <Object , Map <String , Object >> getMessageByIndex (Message <List <Object >> batchMessage , int index ) {
75
+ Assert .isTrue (index < batchMessage .getPayload ().size (), "Index " + index + " is out of bounds as there are only "
76
+ + batchMessage .getPayload ().size () + " messages in a batch." );
77
+ return new Entry <Object , Map <String ,Object >>() {
78
+
79
+ @ Override
80
+ public Map <String , Object > setValue (Map <String , Object > value ) {
81
+ throw new UnsupportedOperationException ();
82
+ }
83
+
84
+ @ SuppressWarnings ("unchecked" )
85
+ @ Override
86
+ public Map <String , Object > getValue () {
87
+ return ((List <Map <String , Object >>) batchMessage .getHeaders ().get (BinderHeaders .BATCH_HEADERS )).get (index );
88
+ }
89
+
90
+ @ Override
91
+ public Object getKey () {
92
+ return batchMessage .getPayload ().get (index );
93
+ }
94
+ };
95
+ }
36
96
37
97
public static class BatchMessageBuilder {
38
98
@@ -48,13 +108,13 @@ public BatchMessageBuilder addMessage(Object payload, Map<String, Object> batchH
48
108
return this ;
49
109
}
50
110
51
- public BatchMessageBuilder addHeader (String key , Object value ) {
111
+ public BatchMessageBuilder addRootHeader (String key , Object value ) {
52
112
this .headers .put (key , value );
53
113
return this ;
54
114
}
55
115
56
116
public Message <List <Object >> build () {
57
- this .headers .put (BATCH_HEADERS , this .batchHeaders );
117
+ this .headers .put (BinderHeaders . BATCH_HEADERS , this .batchHeaders );
58
118
return MessageBuilder .createMessage (payloads , new MessageHeaders (headers ));
59
119
}
60
120
}
0 commit comments