xref: /OpenGrok/tools/src/main/python/opengrok_tools/utils/java.py (revision 5d26fc68eea3cde191e9da9b8c15e86e69903df4)
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#
212d57dc69SVladimir Kotal# Copyright (c) 2008, 2018, Oracle and/or its affiliates. All rights reserved.
222d57dc69SVladimir Kotal# Portions Copyright (c) 2017-2018, Chris Fraire <cfraire@me.com>.
232d57dc69SVladimir Kotal#
242d57dc69SVladimir Kotal
252d57dc69SVladimir Kotalimport platform
262d57dc69SVladimir Kotalfrom .command import Command
272d57dc69SVladimir Kotalfrom .utils import is_exe
282d57dc69SVladimir Kotalimport os
292d57dc69SVladimir Kotal
302d57dc69SVladimir Kotal
312d57dc69SVladimir Kotalclass Java(Command):
322d57dc69SVladimir Kotal    """
332d57dc69SVladimir Kotal    java executable wrapper class
342d57dc69SVladimir Kotal    """
352d57dc69SVladimir Kotal
362d57dc69SVladimir Kotal    def __init__(self, command, logger=None, main_class=None, java=None,
372d57dc69SVladimir Kotal                 jar=None, java_opts=None, classpath=None, env_vars=None,
382d57dc69SVladimir Kotal                 redirect_stderr=True, doprint=False):
392d57dc69SVladimir Kotal
402d57dc69SVladimir Kotal        if not java:
412d57dc69SVladimir Kotal            java = self.FindJava(logger)
422d57dc69SVladimir Kotal            if not java:
432d57dc69SVladimir Kotal                raise Exception("Cannot find Java")
442d57dc69SVladimir Kotal
452d57dc69SVladimir Kotal        if not is_exe(java):
462d57dc69SVladimir Kotal            raise Exception("{} is not executable file".format(java))
472d57dc69SVladimir Kotal
482d57dc69SVladimir Kotal        logger.debug("Java = {}".format(java))
492d57dc69SVladimir Kotal
502d57dc69SVladimir Kotal        java_command = [java]
512d57dc69SVladimir Kotal        if java_opts:
522d57dc69SVladimir Kotal            java_command.extend(java_opts)
532d57dc69SVladimir Kotal        if classpath:
542d57dc69SVladimir Kotal            java_command.append('-classpath')
552d57dc69SVladimir Kotal            java_command.append(classpath)
562d57dc69SVladimir Kotal        if jar:
572d57dc69SVladimir Kotal            java_command.append('-jar')
582d57dc69SVladimir Kotal            java_command.append(jar)
592d57dc69SVladimir Kotal        if main_class:
602d57dc69SVladimir Kotal            java_command.append(main_class)
612d57dc69SVladimir Kotal        env = None
622d57dc69SVladimir Kotal        if env_vars:
632d57dc69SVladimir Kotal            env = {}
642d57dc69SVladimir Kotal            for spec in env_vars:
652d57dc69SVladimir Kotal                if spec.find('=') != -1:
662d57dc69SVladimir Kotal                    name, value = spec.split('=')
672d57dc69SVladimir Kotal                    env[name] = value
682d57dc69SVladimir Kotal
692d57dc69SVladimir Kotal        java_command.extend(command)
702d57dc69SVladimir Kotal        logger.debug("Java command: {}".format(java_command))
712d57dc69SVladimir Kotal
722d57dc69SVladimir Kotal        super().__init__(java_command, logger=logger, env_vars=env,
732d57dc69SVladimir Kotal                         redirect_stderr=redirect_stderr, doprint=doprint)
742d57dc69SVladimir Kotal
752d57dc69SVladimir Kotal    def FindJava(self, logger):
762d57dc69SVladimir Kotal        """
772d57dc69SVladimir Kotal        Determine Java binary based on platform.
782d57dc69SVladimir Kotal        """
792d57dc69SVladimir Kotal        java = None
802d57dc69SVladimir Kotal        system_name = platform.system()
812d57dc69SVladimir Kotal        if system_name == 'SunOS':
822d57dc69SVladimir Kotal            rel = platform.release()
832d57dc69SVladimir Kotal            if rel == '5.10':
842d57dc69SVladimir Kotal                java_home = "/usr/jdk/instances/jdk1.7.0"
852d57dc69SVladimir Kotal            elif rel == '5.11':
862d57dc69SVladimir Kotal                java_home = "/usr/jdk/latest"
872d57dc69SVladimir Kotal
882d57dc69SVladimir Kotal            if os.path.isdir(java_home):
892d57dc69SVladimir Kotal                java = os.path.join(java_home, 'bin', 'java')
902d57dc69SVladimir Kotal        elif system_name == 'Darwin':
91*5d26fc68SDyno Fu            cmd = Command(['/usr/libexec/java_home'])
922d57dc69SVladimir Kotal            cmd.execute()
932d57dc69SVladimir Kotal            java = os.path.join(cmd.getoutputstr(), 'bin', 'java')
942d57dc69SVladimir Kotal        elif system_name == 'Linux':
952d57dc69SVladimir Kotal            link_path = '/etc/alternatives/java'
962d57dc69SVladimir Kotal            if os.path.exists(link_path):
972d57dc69SVladimir Kotal                # Resolve the symlink.
982d57dc69SVladimir Kotal                java = os.path.realpath(link_path)
992d57dc69SVladimir Kotal
1002d57dc69SVladimir Kotal        if not java:
1012d57dc69SVladimir Kotal            java_home = os.environ.get('JAVA_HOME')
1022d57dc69SVladimir Kotal            if java_home:
1032d57dc69SVladimir Kotal                logger.debug("Could not detemine Java home using standard "
1042d57dc69SVladimir Kotal                             "means, trying JAVA_HOME: {}".format(java_home))
1052d57dc69SVladimir Kotal                if os.path.isdir(java_home):
1062d57dc69SVladimir Kotal                    java = os.path.join(java_home, 'bin', 'java')
1072d57dc69SVladimir Kotal
1082d57dc69SVladimir Kotal        return java
109