17
17
package com .hedera .block .server .producer ;
18
18
19
19
import static com .hedera .block .protos .BlockStreamService .*;
20
+ import static com .hedera .block .protos .BlockStreamService .PublishStreamResponse .*;
20
21
21
- import com .google .protobuf .ByteString ;
22
22
import com .hedera .block .server .data .ObjectEvent ;
23
23
import com .hedera .block .server .mediator .StreamMediator ;
24
24
import io .grpc .stub .StreamObserver ;
25
- import java .io .ByteArrayOutputStream ;
26
25
import java .io .IOException ;
27
- import java .io .ObjectOutputStream ;
28
- import java .security .MessageDigest ;
29
26
import java .security .NoSuchAlgorithmException ;
30
27
31
28
/**
@@ -39,6 +36,7 @@ public class ProducerBlockItemObserver implements StreamObserver<PublishStreamRe
39
36
40
37
private final StreamObserver <PublishStreamResponse > publishStreamResponseObserver ;
41
38
private final StreamMediator <ObjectEvent <BlockItem >, BlockItem > streamMediator ;
39
+ private final ItemAckBuilder itemAckBuilder ;
42
40
43
41
/**
44
42
* Constructor for the ProducerBlockStreamObserver class. It is responsible for calling the
@@ -47,9 +45,12 @@ public class ProducerBlockItemObserver implements StreamObserver<PublishStreamRe
47
45
*/
48
46
public ProducerBlockItemObserver (
49
47
final StreamMediator <ObjectEvent <BlockItem >, BlockItem > streamMediator ,
50
- final StreamObserver <PublishStreamResponse > publishStreamResponseObserver ) {
48
+ final StreamObserver <PublishStreamResponse > publishStreamResponseObserver ,
49
+ final ItemAckBuilder itemAckBuilder ) {
50
+
51
51
this .streamMediator = streamMediator ;
52
52
this .publishStreamResponseObserver = publishStreamResponseObserver ;
53
+ this .itemAckBuilder = itemAckBuilder ;
53
54
}
54
55
55
56
/**
@@ -64,16 +65,20 @@ public void onNext(final PublishStreamRequest publishStreamRequest) {
64
65
streamMediator .publishEvent (blockItem );
65
66
66
67
try {
67
- // Send a response back to the upstream producer
68
- // TODO: Use real hash
69
- final ItemAcknowledgement itemAck =
70
- ItemAcknowledgement .newBuilder ()
71
- .setItemAck (ByteString .copyFrom (getFakeHash (blockItem )))
72
- .build ();
68
+ final ItemAcknowledgement itemAck = itemAckBuilder .buildAck (blockItem );
73
69
final PublishStreamResponse publishStreamResponse =
74
70
PublishStreamResponse .newBuilder ().setAcknowledgement (itemAck ).build ();
75
71
publishStreamResponseObserver .onNext (publishStreamResponse );
72
+
76
73
} catch (IOException | NoSuchAlgorithmException e ) {
74
+
75
+ final EndOfStream endOfStream =
76
+ EndOfStream .newBuilder ()
77
+ .setStatus (PublishStreamResponseCode .STREAM_ITEMS_UNKNOWN )
78
+ .build ();
79
+ final PublishStreamResponse errorResponse =
80
+ PublishStreamResponse .newBuilder ().setStatus (endOfStream ).build ();
81
+ publishStreamResponseObserver .onNext (errorResponse );
77
82
LOGGER .log (System .Logger .Level .ERROR , "Error calculating hash" , e );
78
83
}
79
84
}
@@ -99,20 +104,4 @@ public void onCompleted() {
99
104
LOGGER .log (System .Logger .Level .DEBUG , "ProducerBlockStreamObserver completed" );
100
105
publishStreamResponseObserver .onCompleted ();
101
106
}
102
-
103
- private static byte [] getFakeHash (BlockItem blockItem )
104
- throws IOException , NoSuchAlgorithmException {
105
- ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream ();
106
- try (ObjectOutputStream objectOutputStream =
107
- new ObjectOutputStream (byteArrayOutputStream )) {
108
- objectOutputStream .writeObject (blockItem );
109
- }
110
-
111
- // Get the serialized bytes
112
- byte [] serializedObject = byteArrayOutputStream .toByteArray ();
113
-
114
- // Calculate the SHA-256 hash
115
- MessageDigest digest = MessageDigest .getInstance ("SHA-384" );
116
- return digest .digest (serializedObject );
117
- }
118
107
}
0 commit comments