code: protected void mergeProperties(Map<String, String> target, URL baseURL, String urlStr) {
          String includes = null;
          URL url;
          try {
              if (baseURL != null && urlStr == null)
                  url = baseURL;
              else
                  url = new URL(baseURL, urlStr);
  
              // Read properties from file then trim trailing white spaces
              Properties props = KernelUtils.getProperties(url.openStream());
  
              includes = (String) props.remove(BootstrapConstants.BOOTPROP_INCLUDE);
  
              // First value to be set wins. Add values in the current file before
              // looking at included files.
              addMissingProperties(props, target);
  
              if (includes != null)
                  processIncludes(target, url, includes);
          } catch (MalformedURLException e) {
              Debug.printStackTrace(e);
              throw new LocationException("Bad bootstrap.properties URI: " + urlStr, MessageFormat.format(BootstrapConstants.messages.getString("error.bootPropsURI"), urlStr, e), e);
          } catch (IOException e) {
              throw new LocationException("IOException reading bootstrap.properties: " + urlStr, MessageFormat.format(BootstrapConstants.messages.getString("error.bootPropsStream"),
                                                                                                                      urlStr, e), e);
          }
      }
docs: Merge properties from resource specified by urlStr (which is resolved
  against the given
  baseURL, in the case of relative paths) into the target map.
  
  @param target
  Target map to populate with new properties
  @param baseURL
  Base location used for resolving relative paths
  @param urlStr
  URL string describing the properties resource to load
  @param recurse
  Whether or not to follow any included bootstrap resources
  (bootstrap.includes).