2121import java .util .HashMap ;
2222import java .util .Locale ;
2323import java .util .Map ;
24+ import java .util .Objects ;
2425import java .util .concurrent .ExecutorService ;
2526import java .util .concurrent .Executors ;
2627import java .util .concurrent .SynchronousQueue ;
@@ -41,11 +42,9 @@ public class PreparedDbProvider
4142 * loaded so that the databases may be cloned.
4243 */
4344 // @GuardedBy("PreparedDbProvider.class")
44- private static final Map <DatabasePreparer , PrepPipeline > CLUSTERS = new HashMap <>();
45+ private static final Map <ClusterKey , PrepPipeline > CLUSTERS = new HashMap <>();
4546
4647 private final PrepPipeline dbPreparer ;
47- private final Iterable <Consumer <Builder >> customizers ;
48-
4948
5049 public static PreparedDbProvider forPreparer (DatabasePreparer preparer ) {
5150 return forPreparer (preparer , Collections .emptyList ());
@@ -55,11 +54,9 @@ public static PreparedDbProvider forPreparer(DatabasePreparer preparer, Iterable
5554 return new PreparedDbProvider (preparer , customizers );
5655 }
5756
58- private PreparedDbProvider (DatabasePreparer preparer , Iterable <Consumer <Builder >> customizers )
59- {
60- this .customizers = customizers ;
57+ private PreparedDbProvider (DatabasePreparer preparer , Iterable <Consumer <Builder >> customizers ) {
6158 try {
62- dbPreparer = createOrFindPreparer (preparer );
59+ dbPreparer = createOrFindPreparer (preparer , customizers );
6360 } catch (final IOException | SQLException e ) {
6461 throw new RuntimeException (e );
6562 }
@@ -69,9 +66,10 @@ private PreparedDbProvider(DatabasePreparer preparer, Iterable<Consumer<Builder>
6966 * Each schema set has its own database cluster. The template1 database has the schema preloaded so that
7067 * each test case need only create a new database and not re-invoke your preparer.
7168 */
72- private synchronized PrepPipeline createOrFindPreparer (DatabasePreparer preparer ) throws IOException , SQLException
69+ private static synchronized PrepPipeline createOrFindPreparer (DatabasePreparer preparer , Iterable < Consumer < Builder >> customizers ) throws IOException , SQLException
7370 {
74- PrepPipeline result = CLUSTERS .get (preparer );
71+ final ClusterKey key = new ClusterKey (preparer , customizers );
72+ PrepPipeline result = CLUSTERS .get (key );
7573 if (result != null ) {
7674 return result ;
7775 }
@@ -82,7 +80,7 @@ private synchronized PrepPipeline createOrFindPreparer(DatabasePreparer preparer
8280 preparer .prepare (pg .getTemplateDatabase ());
8381
8482 result = new PrepPipeline (pg ).start ();
85- CLUSTERS .put (preparer , result );
83+ CLUSTERS .put (key , result );
8684 return result ;
8785 }
8886
@@ -233,6 +231,36 @@ private static void create(final DataSource connectDb, final String dbName, fina
233231 }
234232 }
235233
234+ private static class ClusterKey {
235+
236+ private final DatabasePreparer preparer ;
237+ private final Builder builder ;
238+
239+ ClusterKey (DatabasePreparer preparer , Iterable <Consumer <Builder >> customizers ) {
240+ this .preparer = preparer ;
241+ this .builder = EmbeddedPostgres .builder ();
242+ customizers .forEach (c -> c .accept (this .builder ));
243+ }
244+
245+ @ Override
246+ public boolean equals (Object o ) {
247+ if (this == o ) {
248+ return true ;
249+ }
250+ if (o == null || getClass () != o .getClass ()) {
251+ return false ;
252+ }
253+ ClusterKey that = (ClusterKey ) o ;
254+ return Objects .equals (preparer , that .preparer ) &&
255+ Objects .equals (builder , that .builder );
256+ }
257+
258+ @ Override
259+ public int hashCode () {
260+ return Objects .hash (preparer , builder );
261+ }
262+ }
263+
236264 public static class DbInfo
237265 {
238266 public static DbInfo ok (final String dbName , final int port , final String user ) {
0 commit comments