#
# Licensed 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. See accompanying LICENSE file.
#

import sys
import os
import subprocess
import time
import ranger_install
import re

cmd = sys.argv[0]
app_type = 'ranger-admin'


service_entry = '--service' in sys.argv


if service_entry:
	try:
		ranger_install.run_setup(cmd)
		jdk_options = ranger_install.get_jdk_options()
		class_path = ranger_install.get_ranger_classpath()
		java_class = 'org.apache.ranger.server.tomcat.EmbeddedServer'
		class_arguments = ''
		from xml.dom.minidom import getDOMImplementation
		dom = getDOMImplementation()
		xmlDoc = dom.createDocument(None, 'service', None)
		xmlDocRoot = xmlDoc.documentElement
		arguments = ' '.join([''.join(jdk_options), '-cp', class_path, java_class, class_arguments])
		def appendTextElement(name, value):
			elem = xmlDoc.createElement(name)
			elem.appendChild(xmlDoc.createTextNode(value))
			xmlDocRoot.appendChild(elem)

		appendTextElement('id', app_type)
		appendTextElement('name', app_type)
		appendTextElement('description', 'This service runs ' + app_type)
		appendTextElement('executable', ranger_install.get_java_env())
		appendTextElement('arguments', arguments)
		appendTextElement('logmode', "append")

		# print tree.toprettyxml(indent=' ')
		uglyXml = xmlDoc.toprettyxml(indent='  ')
		text_re = re.compile('>\n\s+([^<>\s].*?)\n\s+</', re.DOTALL)
		prettyXml = text_re.sub('>\g<1></', uglyXml)

		print prettyXml
	except:
		print "######################## Ranger Setup failed! #######################"
		sys.exit(1)
