@ -304,13 +304,32 @@ public abstract class YamlProcessor {
* @since 4 . 1 . 3
* @since 4 . 1 . 3
* /
* /
protected final Map < String , Object > getFlattenedMap ( Map < String , Object > source ) {
protected final Map < String , Object > getFlattenedMap ( Map < String , Object > source ) {
return getFlattenedMap ( source , false ) ;
}
/ * *
* Return a flattened version of the given map , recursively following any nested Map
* or Collection values . Entries from the resulting map retain the same order as the
* source . When called with the Map from a { @link MatchCallback } the result will
* contain the same values as the { @link MatchCallback } Properties .
* @param source the source map
* @param includeNulls if { @code null } entries can be included in the result
* @return a flattened map
* @since 7 . 0 . 4
* /
protected final Map < String , Object > getFlattenedMap ( Map < String , Object > source , boolean includeNulls ) {
Map < String , Object > result = new LinkedHashMap < > ( ) ;
Map < String , Object > result = new LinkedHashMap < > ( ) ;
buildFlattenedMap ( result , source , null ) ;
buildFlattenedMap ( result , source , null , includeNulls ) ;
return result ;
return result ;
}
}
@SuppressWarnings ( { "rawtypes" , "unchecked" } )
@SuppressWarnings ( { "rawtypes" , "unchecked" } )
private void buildFlattenedMap ( Map < String , Object > result , Map < String , Object > source , @Nullable String path ) {
private void buildFlattenedMap ( Map < String , Object > result , Map < String , Object > source , @Nullable String path ,
boolean includeNulls ) {
if ( includeNulls & & source . isEmpty ( ) ) {
result . put ( path , null ) ;
return ;
}
source . forEach ( ( key , value ) - > {
source . forEach ( ( key , value ) - > {
if ( StringUtils . hasText ( path ) ) {
if ( StringUtils . hasText ( path ) ) {
if ( key . startsWith ( "[" ) ) {
if ( key . startsWith ( "[" ) ) {
@ -325,7 +344,7 @@ public abstract class YamlProcessor {
}
}
else if ( value instanceof Map map ) {
else if ( value instanceof Map map ) {
// Need a compound key
// Need a compound key
buildFlattenedMap ( result , map , key ) ;
buildFlattenedMap ( result , map , key , includeNulls ) ;
}
}
else if ( value instanceof Collection collection ) {
else if ( value instanceof Collection collection ) {
// Need a compound key
// Need a compound key
@ -336,7 +355,7 @@ public abstract class YamlProcessor {
int count = 0 ;
int count = 0 ;
for ( Object object : collection ) {
for ( Object object : collection ) {
buildFlattenedMap ( result , Collections . singletonMap (
buildFlattenedMap ( result , Collections . singletonMap (
"[" + ( count + + ) + "]" , object ) , key ) ;
"[" + ( count + + ) + "]" , object ) , key , includeNulls ) ;
}
}
}
}
}
}