@@ -435,6 +435,39 @@ public void accept(FaultContext serializable) {
435
435
}
436
436
}
437
437
438
+ }
439
+ },
440
+ new MessageMutationFault ("hbft-view-change-first-req-in-R" , "Change first request in R" , List .of (ViewChangeMessage .class )) {
441
+ @ Override
442
+ public void accept (FaultContext serializable ) {
443
+ Optional <Event > event = serializable .getEvent ();
444
+ if (event .isEmpty ()) {
445
+ throw invalidMessageTypeException ;
446
+ }
447
+ if (!(event .get () instanceof MessageEvent messageEvent )) {
448
+ throw invalidMessageTypeException ;
449
+ }
450
+ if (!(messageEvent .getPayload () instanceof ViewChangeMessage message )) {
451
+ throw invalidMessageTypeException ;
452
+ }
453
+ String senderId = messageEvent .getSenderId ();
454
+ Replica sender = serializable .getScenario ().getReplicas ().get (senderId );
455
+ SortedMap <Long , RequestMessage > requests = message .getRequestsR ();
456
+ Entry <Long , RequestMessage > firstReq = requests .firstEntry ();
457
+ if (sender instanceof HbftJavaReplica replica ) {
458
+ SortedMap <Long , RequestMessage > specRequests = replica .getSpeculativeRequests ();
459
+ for (Long key : specRequests .keySet ()) {
460
+ if (!specRequests .get (key ).equals (firstReq .getValue ())) {
461
+ requests .remove (firstReq .getKey ());
462
+ requests .put (firstReq .getKey (), specRequests .get (key ));
463
+ ViewChangeMessage mutatedMessage = message .withRequestsR (requests );
464
+ mutatedMessage .sign (message .getSignedBy ());
465
+ messageEvent .setPayload (mutatedMessage );
466
+ break ;
467
+ }
468
+ }
469
+ }
470
+
438
471
}
439
472
}
440
473
//TODO: be able to change the first or last request
0 commit comments