#!/usr/bin/env python
############################################################################
#
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements.  See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership.  The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License.  You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
############################################################################

import os
import subprocess
import sys
import phoenix_utils

phoenix_utils.setPath()

base_dir = os.path.join(phoenix_utils.current_dir, '..')
phoenix_target_dir = os.path.join(base_dir, 'phoenix-core', 'target')

cp_file_path = os.path.join(phoenix_target_dir, 'cached_classpath.txt')


if not os.path.exists(cp_file_path):
    sys.stderr.write("cached_classpath.txt is not present under "
                + "phoenix-core/target, please rebuild the project first\n")
    sys.exit(1)

logging_config = os.path.join(base_dir, 'bin', 'sandbox-log4j.properties')

cp_components = [phoenix_target_dir + "/*"]
with open(cp_file_path, 'rb') as cp_file:
    cp_components.append(cp_file.read())

java_cmd = ("java $PHOENIX_OPTS -Dlog4j.configuration=file:%s " +
                "-cp %s org.apache.phoenix.Sandbox") % (
                            logging_config, ":".join(cp_components))

proc = subprocess.Popen(java_cmd, shell=True)
try:
    proc.wait()
except KeyboardInterrupt:
    print "Shutting down sandbox..."
    proc.terminate()

proc.wait()

print "Sandbox is stopped"
returncode = proc.returncode
if returncode is not None:
    sys.exit(returncode)
