@@ -78,6 +78,7 @@ public class FlywayDescriptor {
7878 private final boolean ignoreFutureMigrations ;
7979 private final boolean validateOnMigrate ;
8080 private final Map <Field , Object > otherFields ;
81+ private final Map <Field , Object > envConfFields ;
8182 private final Map <Class <?>, Map <Field , Object >> pluginsFields ;
8283
8384 private FlywayDescriptor (FlywayWrapper wrapper ) {
@@ -93,6 +94,7 @@ private FlywayDescriptor(FlywayWrapper wrapper) {
9394 this .validateOnMigrate = wrapper .isValidateOnMigrate ();
9495
9596 this .otherFields = getFields (wrapper .getConfig (), OTHER_FIELDS );
97+ this .envConfFields = getFields (wrapper .getEnvConfig (), PLUGIN_FIELDS );
9698
9799 Map <Class <?>, Map <Field , Object >> pluginsFields = new HashMap <>();
98100 List <Object > plugins = wrapper .getConfigurationExtensions ();
@@ -108,8 +110,6 @@ public static FlywayDescriptor from(FlywayWrapper wrapper) {
108110 }
109111
110112 public void applyTo (FlywayWrapper wrapper ) {
111- Object config = wrapper .getConfig ();
112-
113113 wrapper .setLocations (locations );
114114 wrapper .setSchemas (schemas );
115115 wrapper .setTable (table );
@@ -121,7 +121,8 @@ public void applyTo(FlywayWrapper wrapper) {
121121 wrapper .setIgnoreFutureMigrations (ignoreFutureMigrations );
122122 wrapper .setValidateOnMigrate (validateOnMigrate );
123123
124- setFields (config , otherFields );
124+ setFields (wrapper .getConfig (), otherFields );
125+ setFields (wrapper .getEnvConfig (), envConfFields );
125126
126127 List <Object > plugins = wrapper .getConfigurationExtensions ();
127128 for (Object plugin : plugins ) {
@@ -186,6 +187,7 @@ public boolean equals(Object o) {
186187 && Objects .equals (sqlMigrationSeparator , that .sqlMigrationSeparator )
187188 && Objects .equals (sqlMigrationSuffixes , that .sqlMigrationSuffixes )
188189 && Objects .equals (otherFields , that .otherFields )
190+ && Objects .equals (envConfFields , that .envConfFields )
189191 && Objects .equals (pluginsFields , that .pluginsFields );
190192 }
191193
@@ -195,27 +197,31 @@ public int hashCode() {
195197 sqlMigrationPrefix , repeatableSqlMigrationPrefix ,
196198 sqlMigrationSeparator , sqlMigrationSuffixes ,
197199 ignoreMissingMigrations , ignoreFutureMigrations ,
198- validateOnMigrate , otherFields , pluginsFields );
200+ validateOnMigrate , otherFields , envConfFields , pluginsFields );
199201 }
200202
201203 private static void setCollection (Field field , Object target , Collection <?> value ) {
202204 Collection collection = (Collection ) getField (field , target );
203205 if (collection != null ) {
204- collection .clear ();
205- collection .addAll (value );
206- } else {
207- setField (field , target , value );
206+ try {
207+ collection .clear ();
208+ collection .addAll (value );
209+ return ;
210+ } catch (UnsupportedOperationException e ) {}
208211 }
212+ setField (field , target , Lists .newArrayList (value ));
209213 }
210214
211215 private static void setMap (Field field , Object target , Map <?, ?> value ) {
212216 Map map = (Map ) getField (field , target );
213217 if (map != null ) {
214- map .clear ();
215- map .putAll (value );
216- } else {
217- setField (field , target , value );
218+ try {
219+ map .clear ();
220+ map .putAll (value );
221+ return ;
222+ } catch (UnsupportedOperationException e ) {}
218223 }
224+ setField (field , target , Maps .newHashMap (value ));
219225 }
220226
221227 private static void setArray (Field field , Object config , List <?> value ) {
@@ -227,28 +233,34 @@ private static void setArray(Field field, Object config, List<?> value) {
227233 private static Map <Field , Object > getFields (Object targetObject , FieldFilter fieldFilter ) {
228234 Map <Field , Object > fieldValues = new HashMap <>();
229235
230- Class <?> objectClass = targetObject .getClass ();
231- doWithFields (objectClass , field -> {
232- makeAccessible (field );
233- Object value = getField (field , targetObject );
234-
235- if (value != null ) {
236- if (Collection .class .isAssignableFrom (field .getType ())) {
237- value = Lists .newArrayList ((Collection <?>) value );
238- } else if (Map .class .isAssignableFrom (field .getType ())) {
239- value = Maps .newHashMap ((Map <?, ?>) value );
240- } else if (field .getType ().isArray ()) {
241- value = Lists .newArrayList ((Object []) value );
236+ if (targetObject != null ) {
237+ Class <?> objectClass = targetObject .getClass ();
238+ doWithFields (objectClass , field -> {
239+ makeAccessible (field );
240+ Object value = getField (field , targetObject );
241+
242+ if (value != null ) {
243+ if (Collection .class .isAssignableFrom (field .getType ())) {
244+ value = Lists .newArrayList ((Collection <?>) value );
245+ } else if (Map .class .isAssignableFrom (field .getType ())) {
246+ value = Maps .newHashMap ((Map <?, ?>) value );
247+ } else if (field .getType ().isArray ()) {
248+ value = Lists .newArrayList ((Object []) value );
249+ }
242250 }
243- }
244251
245- fieldValues .put (field , value );
246- }, fieldFilter );
252+ fieldValues .put (field , value );
253+ }, fieldFilter );
254+ }
247255
248256 return fieldValues ;
249257 }
250258
251259 private static void setFields (Object targetObject , Map <Field , Object > fieldValues ) {
260+ if (targetObject == null ) {
261+ return ;
262+ }
263+
252264 fieldValues .forEach ((field , value ) -> {
253265 makeAccessible (field );
254266
0 commit comments