2424
2525import java .util .Collections ;
2626
27+ import static com .mongodb .assertions .Assertions .assertFalse ;
2728import static com .mongodb .client .Fixture .getMongoClientSettingsBuilder ;
2829
2930public final class FailPoint implements AutoCloseable {
@@ -48,23 +49,56 @@ public static FailPoint enable(final BsonDocument configureFailPointDoc, final S
4849 .hosts (Collections .singletonList (serverAddress )))
4950 .build ();
5051 MongoClient client = MongoClients .create (clientSettings );
51- return enable (configureFailPointDoc , client );
52- }
53-
54- private static FailPoint enable (final BsonDocument configureFailPointDoc , final MongoClient client ) {
55- FailPoint result = new FailPoint (configureFailPointDoc , client );
56- client .getDatabase ("admin" ).runCommand (configureFailPointDoc );
57- return result ;
52+ try (Guard guard = new Guard (configureFailPointDoc , client )) {
53+ client .getDatabase ("admin" ).runCommand (configureFailPointDoc );
54+ return guard .intoFailPoint ();
55+ }
5856 }
5957
6058 @ Override
6159 public void close () {
62- try {
60+ disableAndClose (failPointDocument , client );
61+ }
62+
63+ private static void disableAndClose (final BsonDocument failPointDocument , final MongoClient client ) {
64+ try (MongoClient ignored = client ) {
6365 client .getDatabase ("admin" ).runCommand (new BsonDocument ()
6466 .append ("configureFailPoint" , failPointDocument .getString ("configureFailPoint" ))
6567 .append ("mode" , new BsonString ("off" )));
66- } finally {
67- client .close ();
68+ }
69+ }
70+
71+ private static final class Guard implements AutoCloseable {
72+ private final BsonDocument failPointDocument ;
73+ private final MongoClient client ;
74+ private boolean consumed ;
75+
76+ Guard (final BsonDocument failPointDocument , final MongoClient client ) {
77+ this .failPointDocument = failPointDocument ;
78+ this .client = client ;
79+ consumed = false ;
80+ }
81+
82+ /**
83+ * May be invoked at most once.
84+ *
85+ * @see #close()
86+ */
87+ FailPoint intoFailPoint () {
88+ assertFalse (consumed );
89+ FailPoint result = new FailPoint (failPointDocument , client );
90+ consumed = true ;
91+ return result ;
92+ }
93+
94+ /**
95+ * Invokes {@link #disableAndClose(BsonDocument, MongoClient)} unless {@link #intoFailPoint()} was invoked.
96+ */
97+ @ Override
98+ public void close () {
99+ if (!consumed ) {
100+ disableAndClose (failPointDocument , client );
101+ }
68102 }
69103 }
70104}
0 commit comments