docs: public static void setCustomProperties(Map<String, Object> d) {
          if (TraceComponent.isAnyTracingEnabled() && tc.isEntryEnabled()) {
              Tr.entry(tc, "setCustomProperties");
          }
  
          String ky;
          String propertyKey;
  
          // For comparison purposes we need the mixed case key strings coming from metatype.xml and server.xml to be in lower case.
          Set<String> newKeySet = new HashSet<String>();                                                
          for (String key:d.keySet()) {                                                                 
              newKeySet.add(key.toLowerCase());                                                         
          }                                                                                             
  
          // go through each entry that is in the set of keys that we are getting from metatype.xml and server.xml
          for (Map.Entry<String, Object> entry : d.entrySet()) {
              ky = entry.getKey();
              Object value = entry.getValue();
          
              // using the lower case value of short or long name that was configured
              // see if the string maps to one of the short names in our table.
              // if it matches then get the long name back.  otherwise keep the name as is.
              propertyKey = getStringKey(ky.toLowerCase());
              
              if (!ky.equalsIgnoreCase(propertyKey)) {
                  // found in map - check existence of fully qualified prop as well
                  // if we mapped to a new long name, see if it is already in the passed in data because
                  // configured long names have priority, and if it is in the table elsewhere, then don't use
                  // this mapped short name value, because the long name was set in server.xml
                  if (newKeySet.contains(propertyKey)) {                                           
                      continue;
                  }
              }
              
              // store all values as lower case, so as to read them later in a consistent fashion
              propertyKey =  propertyKey.toLowerCase();
              
              if (value instanceof String) {
                  if (TraceComponent.isAnyTracingEnabled() && tc.isDebugEnabled()) {
                      Tr.debug(tc, "Key: " + propertyKey + "  type: String  value: " + value);
                  }
                  customProps.setProperty(propertyKey, (String) value);
  
              } else if (value instanceof Boolean) {
                  if (TraceComponent.isAnyTracingEnabled() && tc.isDebugEnabled()) {
                      Tr.debug(tc, "Key: " + propertyKey + "  type: Boolean  value: " + ((Boolean) value).toString());
                  }
                  customProps.setProperty(propertyKey, ((Boolean) value).toString());
  
              } else if (value instanceof Integer) {
                  if (TraceComponent.isAnyTracingEnabled() && tc.isDebugEnabled()) {
                      Tr.debug(tc, "Key: " + propertyKey + "  type: Integer  value: " + ((Integer) value).toString());
                  }
                  customProps.setProperty(propertyKey, ((Integer) value).toString());
              } else {
                  // don't update, not a custom property we care about here
                  if (TraceComponent.isAnyTracingEnabled() && tc.isDebugEnabled()) {
                      Tr.debug(tc, "Key not processed due to type, Key: " + propertyKey);
                  }
              }
          }
  
          setCustomPropertyVariables(); //Need to update all the variables.
  
          setCustomizedDefaultValues(); //Customize default value depending on servlet level, initial size....etc..
  
          if (TraceComponent.isAnyTracingEnabled() && tc.isEntryEnabled()) {
              Tr.exit(tc, "setCustomProperties");
          }
  
      }