void (PropertiesProvider provider) { while (myResolver.hasNext()) { final String propName = myResolver.next(); final String value = provider.getPropertyValue(propName); if (value != null) { myNamesToSkip.add(propName); // prevent infinite recursion final String propValue; if (provider instanceof PropertiesProvider.SkipPropertyExpansionInValues) { propValue = value; } else { final PropertyExpander propertyValueExpander = new PropertyExpander(value, myNamesToSkip); propertyValueExpander.setPropertyExpansionListener(myPropertyExpansionListener); if (propertyValueExpander.hasPropertiesToExpand()) { for (PropertiesProvider p : myProviders) { propertyValueExpander.acceptProvider(p); if (!propertyValueExpander.hasPropertiesToExpand()) { break; } } if (propertyValueExpander.hasPropertiesToExpand()) { propertyValueExpander.acceptProvider(provider); } } propValue = propertyValueExpander.getResult(); } myResolver.replace(propValue); notifyPropertyExpanded(propName, propValue); } } myProviders.add(provider); myResolver.restart(); }