code: private void readUserAttributes()
          throws EFapsException
      {
          // if the MAPPER is empty it must be initialized
          if (UserAttributesSet.MAPPER.isEmpty()) {
              UserAttributesSet.UserAttributesDefinition.values();
          }
  
          final Set<Type> types = CIAdminUser.AttributeAbstract.getType().getChildTypes();
          for (final Type type : types) {
              if (UserAttributesSet.MAPPER.containsKey(type.getName())) {
                  final UserAttributesDefinition definition = UserAttributesSet.MAPPER.get(type.getName());
                  final QueryBuilder queryBldr = new QueryBuilder(Type.get(definition.name));
                  queryBldr.addWhereAttrEqValue("UserLink", this.userId);
                  final MultiPrintQuery multi = queryBldr.getPrint();
                  multi.addAttribute(definition.valueAttribute);
                  if (definition.keyAttribute != null) {
                      multi.addAttribute(definition.keyAttribute);
                  }
                  multi.executeWithoutAccessCheck();
                  while (multi.next()) {
                      final String key;
                      if (definition.keyAttribute == null) {
                          key = definition.name;
                      } else {
                          key = multi.getAttribute(definition.keyAttribute).toString().trim();
                      }
                      this.attributes.put(key,
                                      new UserAttribute(definition.name, multi.getAttribute(definition.valueAttribute)
                                                      .toString().trim(), false));
                  }
              }
          }
      }
docs: Reads all {@link UserAttribute user attributes} from the eFaps database
  which belong to the user this user attribute set is read to and caches
  them in a map for fast access.
  
  @see #UserAttribute
  @throws EFapsException if attributes could not be read from eFaps