xref: /OpenGrok/tools/src/main/python/opengrok_tools/utils/java.py (revision b9361335ec266d2bd84d6bb0293ddc1661802636)
12d57dc69SVladimir Kotal#!/usr/bin/env python3
22d57dc69SVladimir Kotal
32d57dc69SVladimir Kotal# CDDL HEADER START
42d57dc69SVladimir Kotal#
52d57dc69SVladimir Kotal# The contents of this file are subject to the terms of the
62d57dc69SVladimir Kotal# Common Development and Distribution License (the "License").
72d57dc69SVladimir Kotal# You may not use this file except in compliance with the License.
82d57dc69SVladimir Kotal#
92d57dc69SVladimir Kotal# See LICENSE.txt included in this distribution for the specific
102d57dc69SVladimir Kotal# language governing permissions and limitations under the License.
112d57dc69SVladimir Kotal#
122d57dc69SVladimir Kotal# When distributing Covered Code, include this CDDL HEADER in each
132d57dc69SVladimir Kotal# file and include the License file at LICENSE.txt.
142d57dc69SVladimir Kotal# If applicable, add the following below this CDDL HEADER, with the
152d57dc69SVladimir Kotal# fields enclosed by brackets "[]" replaced with your own identifying
162d57dc69SVladimir Kotal# information: Portions Copyright [yyyy] [name of copyright owner]
172d57dc69SVladimir Kotal#
182d57dc69SVladimir Kotal# CDDL HEADER END
192d57dc69SVladimir Kotal
202d57dc69SVladimir Kotal#
21*b9361335SVladimir Kotal# Copyright (c) 2008, 2021, Oracle and/or its affiliates. All rights reserved.
222d57dc69SVladimir Kotal# Portions Copyright (c) 2017-2018, Chris Fraire <cfraire@me.com>.
232d57dc69SVladimir Kotal#
242d57dc69SVladimir Kotal
25*b9361335SVladimir Kotalimport os
262d57dc69SVladimir Kotalimport platform
27*b9361335SVladimir Kotalimport shutil
28*b9361335SVladimir Kotal
292d57dc69SVladimir Kotalfrom .command import Command
302d57dc69SVladimir Kotalfrom .utils import is_exe
312d57dc69SVladimir Kotal
322d57dc69SVladimir Kotal
332d57dc69SVladimir Kotalclass Java(Command):
342d57dc69SVladimir Kotal    """
352d57dc69SVladimir Kotal    java executable wrapper class
362d57dc69SVladimir Kotal    """
372d57dc69SVladimir Kotal
382d57dc69SVladimir Kotal    def __init__(self, command, logger=None, main_class=None, java=None,
392d57dc69SVladimir Kotal                 jar=None, java_opts=None, classpath=None, env_vars=None,
402d57dc69SVladimir Kotal                 redirect_stderr=True, doprint=False):
412d57dc69SVladimir Kotal
422d57dc69SVladimir Kotal        if not java:
432d57dc69SVladimir Kotal            java = self.FindJava(logger)
442d57dc69SVladimir Kotal            if not java:
452d57dc69SVladimir Kotal                raise Exception("Cannot find Java")
462d57dc69SVladimir Kotal
472d57dc69SVladimir Kotal        if not is_exe(java):
482d57dc69SVladimir Kotal            raise Exception("{} is not executable file".format(java))
492d57dc69SVladimir Kotal
502d57dc69SVladimir Kotal        logger.debug("Java = {}".format(java))
512d57dc69SVladimir Kotal
522d57dc69SVladimir Kotal        java_command = [java]
532d57dc69SVladimir Kotal        if java_opts:
542d57dc69SVladimir Kotal            java_command.extend(java_opts)
552d57dc69SVladimir Kotal        if classpath:
562d57dc69SVladimir Kotal            java_command.append('-classpath')
572d57dc69SVladimir Kotal            java_command.append(classpath)
582d57dc69SVladimir Kotal        if jar:
592d57dc69SVladimir Kotal            java_command.append('-jar')
602d57dc69SVladimir Kotal            java_command.append(jar)
612d57dc69SVladimir Kotal        if main_class:
622d57dc69SVladimir Kotal            java_command.append(main_class)
632d57dc69SVladimir Kotal        env = None
642d57dc69SVladimir Kotal        if env_vars:
652d57dc69SVladimir Kotal            env = {}
662d57dc69SVladimir Kotal            for spec in env_vars:
672d57dc69SVladimir Kotal                if spec.find('=') != -1:
682d57dc69SVladimir Kotal                    name, value = spec.split('=')
692d57dc69SVladimir Kotal                    env[name] = value
702d57dc69SVladimir Kotal
712d57dc69SVladimir Kotal        java_command.extend(command)
722d57dc69SVladimir Kotal        logger.debug("Java command: {}".format(java_command))
732d57dc69SVladimir Kotal
742d57dc69SVladimir Kotal        super().__init__(java_command, logger=logger, env_vars=env,
752d57dc69SVladimir Kotal                         redirect_stderr=redirect_stderr, doprint=doprint)
762d57dc69SVladimir Kotal
772d57dc69SVladimir Kotal    def FindJava(self, logger):
782d57dc69SVladimir Kotal        """
792d57dc69SVladimir Kotal        Determine Java binary based on platform.
802d57dc69SVladimir Kotal        """
812d57dc69SVladimir Kotal        java = None
822d57dc69SVladimir Kotal        system_name = platform.system()
832d57dc69SVladimir Kotal        if system_name == 'SunOS':
842d57dc69SVladimir Kotal            rel = platform.release()
852d57dc69SVladimir Kotal            if rel == '5.10':
862d57dc69SVladimir Kotal                java_home = "/usr/jdk/instances/jdk1.7.0"
872d57dc69SVladimir Kotal            elif rel == '5.11':
882d57dc69SVladimir Kotal                java_home = "/usr/jdk/latest"
892d57dc69SVladimir Kotal
902d57dc69SVladimir Kotal            if os.path.isdir(java_home):
912d57dc69SVladimir Kotal                java = os.path.join(java_home, 'bin', 'java')
922d57dc69SVladimir Kotal        elif system_name == 'Darwin':
935d26fc68SDyno Fu            cmd = Command(['/usr/libexec/java_home'])
942d57dc69SVladimir Kotal            cmd.execute()
952d57dc69SVladimir Kotal            java = os.path.join(cmd.getoutputstr(), 'bin', 'java')
962d57dc69SVladimir Kotal        elif system_name == 'Linux':
972d57dc69SVladimir Kotal            link_path = '/etc/alternatives/java'
982d57dc69SVladimir Kotal            if os.path.exists(link_path):
992d57dc69SVladimir Kotal                # Resolve the symlink.
1002d57dc69SVladimir Kotal                java = os.path.realpath(link_path)
1012d57dc69SVladimir Kotal
1022d57dc69SVladimir Kotal        if not java:
1032d57dc69SVladimir Kotal            java_home = os.environ.get('JAVA_HOME')
1042d57dc69SVladimir Kotal            if java_home:
1052d57dc69SVladimir Kotal                logger.debug("Could not detemine Java home using standard "
1062d57dc69SVladimir Kotal                             "means, trying JAVA_HOME: {}".format(java_home))
1072d57dc69SVladimir Kotal                if os.path.isdir(java_home):
1082d57dc69SVladimir Kotal                    java = os.path.join(java_home, 'bin', 'java')
1092d57dc69SVladimir Kotal
110*b9361335SVladimir Kotal        if not java:
111*b9361335SVladimir Kotal            logger.debug("Could not detemine java executable using standard "
112*b9361335SVladimir Kotal                         "means, trying system path")
113*b9361335SVladimir Kotal            java = shutil.which('java')
114*b9361335SVladimir Kotal
1152d57dc69SVladimir Kotal        return java
116