docs: def _check_suggestions(app_json, publish=False):
      """
      Examines the specified dxapp.json file and warns about any
      violations of suggestions guidelines.
  
      :raises: AppBuilderException for data objects that could not be found
      """
      for input_field in app_json.get('inputSpec', []):
          for suggestion in input_field.get('suggestions', []):
              if 'project' in suggestion:
                  try:
                      project = dxpy.api.project_describe(suggestion['project'], {"permissions": True})
                      if 'PUBLIC' not in project['permissions'] and publish:
                          logger.warn('Project {name} NOT PUBLIC!'.format(name=project['name']))
                  except dxpy.exceptions.DXAPIError as e:
                      if e.code == 404:
                          logger.warn('Suggested project {name} does not exist, or not accessible by user'.format(
                                       name=suggestion['project']))
                  if 'path' in suggestion:
                      try:
                          check_folder_exists(suggestion['project'], suggestion['path'], '')
                      except ResolutionError as e:
                          logger.warn('Folder {path} could not be found in project {project}'.format(
                                       path=suggestion['path'], project=suggestion['project']))
              if '$dnanexus_link' in suggestion:
                  if suggestion['$dnanexus_link'].startswith(('file-', 'record-')):
                      try:
                          dnanexus_link = dxpy.describe(suggestion['$dnanexus_link'])
                      except dxpy.exceptions.DXAPIError as e:
                          if e.code == 404:
                              raise dxpy.app_builder.AppBuilderException(
                                  'Suggested object {name} could not be found'.format(
                                      name=suggestion['$dnanexus_link']))
                      except Exception as e:
                          raise dxpy.app_builder.AppBuilderException(str(e))
              if 'value' in suggestion and isinstance(suggestion["value"], dict):
                  if '$dnanexus_link' in suggestion['value']:
                      # Check if we have JSON or string
                      if isinstance(suggestion['value']['$dnanexus_link'], dict):
                          if 'project' in suggestion['value']['$dnanexus_link']:
                              try:
                                  dxpy.api.project_describe(suggestion['value']['$dnanexus_link']['project'])
                              except dxpy.exceptions.DXAPIError as e:
                                  if e.code == 404:
                                      logger.warn('Suggested project {name} does not exist, or not accessible by user'.format(
                                                   name=suggestion['value']['$dnanexus_link']['project']))
                      elif isinstance(suggestion['value']['$dnanexus_link'], basestring):
                          if suggestion['value']['$dnanexus_link'].startswith(('file-', 'record-')):
                              try:
                                  dnanexus_link = dxpy.describe(suggestion['value']['$dnanexus_link'])
                              except dxpy.exceptions.DXAPIError as e:
                                  if e.code == 404:
                                      raise dxpy.app_builder.AppBuilderException(
                                          'Suggested object {name} could not be found'.format(
                                              name=suggestion['value']['$dnanexus_link']))
                              except Exception as e:
                                  raise dxpy.app_builder.AppBuilderException(str(e))