#!/usr/bin/env python
from cygwinreg import * # cygwinreg must be installed from easy_install
from re import *
from subprocess import *
import os 
import sys
import time


"""
This program is a wrapper that allows cygwin to communicate with native java.

Unfortunately, it is necessary to export all cygwin paths to windows paths,
as java will not understand the cygwin relative paths. 

Fortunately, cygwin provides an API to do this, though exporting every environment variable is rather costly (it takes several seconds to do so).

This is the only way that we can ensure that java is getting the correct environment parameters that it is expecting.

"""


PATH_SUFFIX="/bin/java.exe"

def cleanpath(path):

	def quotePath(match):
		return "/\""+match.group(1)+"\"/"

	path=path.replace("\\","/")
	cleanpath= sub ("/(.*?\s.*?)/",quotePath ,path)

	return cleanpath

def getDosPath(path,type="w"):

	path = cleanpath(path)
	com ="cygpath -"+type+" "+path

	try:#try/catch needed for windows 7 forking issues
		res = Popen(com,shell=True,stdout=PIPE,stderr=PIPE).communicate()
	
		if (res[0] == ""):
			print "Failed on path:\n\t"+path
			print res[1]
			raise Exception

		res= res[0].strip().replace("\t","").replace("\n"," ")

	except:

		res = os.popen(com).read().strip().replace("\t","").replace("\n","")
	return res

def getEnv():
		
	environ = os.environ
	print "Pleas wait, exporting cygwin environment..."
	start = time.time()
	for k, v in environ.items():       
		res = v
		if (os.path.lexists(v)):
			try:
				res=getDosPath(v)
			except:
				print "There was an error exporting variable (%s,%s)" % (k,v)
		
		environ[k]=res
	end = time.time()
	elapsed = end-start
	print "Exporting environment took "+str(elapsed)+ " seconds."

	return environ

def getJava():

	toOpen="SOFTWARE\\JavaSoft\\Java Runtime Environment"
	key =OpenKey(HKEY_LOCAL_MACHINE,toOpen)
	version = QueryValueEx(key,"CurrentVersion")[0]
	subkey = OpenKey(key,version)
	path = QueryValueEx(subkey,"JavaHome")[0]
	java_path= cleanpath(path+PATH_SUFFIX)

	print "Found java "+version+ " at "+path
	return java_path

def runJava():
	args = sys.argv
	args.pop(0)
	try:
		jarIndex = args.index("-jar")+1
		
		if (jarIndex < len(args)):
			args[jarIndex] = cleanpath(getDosPath(args[jarIndex]))

	except ValueError:
		print "Not running a jar"
		print args[len(args)-1]
	
	javaCom = getJava()
	args.insert(0,javaCom)
	command=" ".join(args)
	try:
		Popen(command,shell=True,env=getEnv())
	except:
		os.popen(command)



if __name__=="__main__":
	runJava()