#!/usr/bin/python
# Copyright 2015 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

"""Wrapper script to run java command as action with gn."""

import os
import subprocess
import sys

EXIT_SUCCESS = 0
EXIT_FAILURE = 1


def IsExecutable(path):
  """Returns whether file at |path| exists and is executable.

  Args:
    path: absolute or relative path to test.

  Returns:
    True if the file at |path| exists, False otherwise.
  """
  return os.path.isfile(path) and os.access(path, os.X_OK)


def FindCommand(command):
  """Looks up for |command| in PATH.

  Args:
    command: name of the command to lookup, if command is a relative or
      absolute path (i.e. contains some path separator) then only that
      path will be tested.

  Returns:
    Full path to command or None if the command was not found.

    On Windows, this respects the PATHEXT environment variable when the
    command name does not have an extension.
  """
  fpath, _ = os.path.split(command)
  if fpath:
    if IsExecutable(command):
      return command

  if sys.platform == 'win32':
    # On Windows, if the command does not have an extension, cmd.exe will
    # try all extensions from PATHEXT when resolving the full path.
    command, ext = os.path.splitext(command)
    if not ext:
      exts = os.environ['PATHEXT'].split(os.path.pathsep)
    else:
      exts = [ext]
  else:
    exts = ['']

  for path in os.environ['PATH'].split(os.path.pathsep):
    for ext in exts:
      path = os.path.join(path, command) + ext
      if IsExecutable(path):
        return path

  return None


def main():
  java_path = FindCommand('java')
  if not java_path:
    sys.stderr.write('java: command not found\n')
    sys.exit(EXIT_FAILURE)

  args = sys.argv[1:]
  if len(args) < 2 or args[0] != '-jar':
    sys.stderr.write('usage: %s -jar JARPATH [java_args]...\n' % sys.argv[0])
    sys.exit(EXIT_FAILURE)

  return subprocess.check_call([java_path] + args)


if __name__ == '__main__':
  sys.exit(main())
