code: private void sortPropertyNames(List<String> names) {
          for (String name : new ArrayList<String>(names)) {
              int propertyIndex = names.indexOf(name);
              RelaxedDataBinder.BeanPath path = new RelaxedDataBinder.BeanPath(name);
              for (String prefix : path.prefixes()) {
                  int prefixIndex = names.indexOf(prefix);
                  if (prefixIndex >= propertyIndex) {
                      // The child property has a parent in the list in the wrong order
                      names.remove(name);
                      names.add(prefixIndex, name);
                  }
              }
          }
      }
docs: Sort by name so that parent properties get processed first (e.g. 'foo.bar'
  before 'foo.bar.spam'). Don't use Collections.sort() because the order might
  be significant for other property names (it shouldn't be but who knows what
  people might be relying on, e.g. HSQL has a JDBCXADataSource where
  "databaseName" is a synonym for "url").
  
  @param names the names to sort