/**
   * Returns shared parameters for a given instance identifier.
   *
   * @param instanceId the instance identifier
   * @return shared parameters or null, if no shared parameters exist for given instance identifier
   * @throws Exception if an error occurs while reading parameters
   */
  public synchronized SharedParameters getShared(String instanceId) throws Exception {
    String safeInstanceId = escapeInstanceIdentifier(instanceId);

    log.trace("getShared(instance = {}, directory = {})", instanceId, safeInstanceId);

    SharedParameters parameters = sharedParameters.get(safeInstanceId);
    if (!reloadIfChanged) {
      return parameters;
    }

    if (parameters != null && parameters.hasChanged()) {
      parameters.reload();
    } else if (parameters == null) {
      // Parameters not cached, attempt to load it from disk.
      Path instanceDir = Paths.get(path.toString(), safeInstanceId);
      loadSharedParameters(instanceDir, sharedParameters);
    }

    return sharedParameters.get(safeInstanceId);
  }