code: @Override
      @JsonIgnore
      public final Set<String> getPossibleUserAttributeNames(final IPersonAttributeDaoFilter filter) {
          Set<String> attrNames = null;
  
          for (final IPersonAttributeDao currentDao : this.personAttributeDaos) {
  
              if (filter != null && !filter.choosePersonAttributeDao(currentDao)) {
                  continue;
              }
              boolean handledException = false;
              Set<String> currentDaoAttrNames = null;
              try {
                  currentDaoAttrNames = currentDao.getPossibleUserAttributeNames(filter);
  
                  if (this.logger.isDebugEnabled()) {
                      this.logger.debug("Retrieved possible attribute names '" + currentDaoAttrNames + "' from '" + currentDao + "'");
                  }
              } catch (final RuntimeException rte) {
                  handledException |= handleRuntimeException(currentDao, rte);
              }
  
              if (currentDaoAttrNames != null) {
                  if (attrNames == null) {
                      attrNames = new LinkedHashSet<>();
                  }
  
                  attrNames = this.attrMerger.mergePossibleUserAttributeNames(attrNames, currentDaoAttrNames);
              }
  
              if (this.stopOnSuccess && !handledException) {
                  if (this.logger.isDebugEnabled()) {
                      this.logger.debug("Successfully retrieved possible user attributes from a child DAO and stopOnSuccess is true, stopping iteration of child DAOs");
                  }
  
                  break;
              }
          }
  
          if (this.logger.isDebugEnabled()) {
              this.logger.debug("Aggregated possible attribute names '" + attrNames + "'");
          }
  
          if (attrNames == null) {
              return null;
          }
  
          return Collections.unmodifiableSet(attrNames);
      }
docs: Merges the results of calling {@link IPersonAttributeDao#getPossibleUserAttributeNames(IPersonAttributeDaoFilter)} on each child dao using
  the configured {@link IAttributeMerger#mergePossibleUserAttributeNames(Set, Set)}. If all children return null
  this method returns null as well. If any child does not return null this method will not return null.
  
  @see IPersonAttributeDao#getPossibleUserAttributeNames(IPersonAttributeDaoFilter)