<reponame>doom38/jython_v2.2.1<gh_stars>0
from org.python.core import parser
from org.python.compiler.Module import compile
from org.python.compiler import JavaMaker
import org, java
import string, os

from FreezeVisitor import FreezeVisitor
from depend import depend

suffix = '$py'
prefix = 'pycode.'

class Freezer:
	def __init__(self, out, shallow=0, useProxy=0, dependFilter=None):
		self.proxies = {}
		self.modules = {}
		self.packages = {}
		
		self.classes = {}
		self.props = {}
		self.events = {}
		self.javaclasses = []
		
		self.out = out
		self.shallow = shallow
		self.dependFilter = dependFilter
		self.useProxy = useProxy

	def getPackage(self, package):
		fp = open(package.__file__, 'r')
		data = fp.read()
		fp.close()
		return data
		
	def freeze(self, myname, data=None, file='', package=None):
		print 'freezing', myname

		if data is None:
			package = __import__(myname)
			data = self.getPackage(package)
			if file == '':
				file = package.__file__

		f = FreezeVisitor(self.events, self.props, classes=self.classes, classname=myname)
		node = parser.parse(data, 'exec')
		f.suite(node)
				
		if not self.shallow:
			for proxy in f.proxies.values():
				#if proxy.__name__ != 'java.applet.Applet':
				self.proxies[proxy] = 1
						
			for package in f.packages.values():
				name = package.__name__
				if self.modules.has_key(package):
					continue
				elif hasattr(package, '__path__'):
					self.packages[package] = 1
				elif isinstance(package, org.python.core.PyModule):
					self.modules[package] = 1
					self.freeze(name, self.getPackage(package), package.__file__)
				else:
					self.packages[package] = 1
				
			ofp = java.io.ByteArrayOutputStream()
	
			nm = myname+suffix
			compile(node, ofp, nm, file, 1, 0)
			self.out.write(nm, ofp)
		
		if f.realclass != None:
			self.javaclasses.append( (f.realclass.__name__, myname, f.methods) )
			if self.useProxy:
				self.proxies[f.realclass] = 1
				
	def makeProxy(self, proxy):
		os = java.io.ByteArrayOutputStream()
		org.python.compiler.ProxyMaker.makeProxy(proxy, os)
		#print proxy, os, os.size()
		self.out.write('org.python.proxies.'+proxy, os)		


	def makeJavaClass(self, javaclass, myname, methods, main=0, frozen=1):
		#print methods
		jm = JavaMaker(javaclass, myname, myname, myname, 
					self.requiredPackages, 
					[], methods, frozen, main)
		jm.build()
		
		os = java.io.ByteArrayOutputStream()
		jm.classfile.write(os)
		self.out.write(myname, os)


	def finish(self, main=0):
		names = {}
		
		if not self.shallow:
			pkgText = "__path__ = []"
			pkgNode = parser.parse(pkgText, 'exec')
	
			for package in self.packages.keys():
				if isinstance(package, org.python.core.PyModule):
					myname = package.__name__
					ofp = java.io.ByteArrayOutputStream()
					compile(pkgNode, ofp, myname+suffix, package.__path__[0], 1, 0)
					self.out.write(myname+suffix, ofp)
					
					self.freeze(myname+'.__init__')
				else:
					names[package.__name__] = package
				
			for prop in self.props.keys():
				#print 'prop', prop
				if self.events.has_key(prop):
					print 'adding event', prop, self.events[prop]
					self.proxies[self.events[prop]] = 1	
			#print self.events
			
			# Make proxies
			for proxy in self.proxies.keys():
				self.makeProxy(proxy.__name__)
	
	
			for name in names.keys():
				parts = string.split(name, '.')
				name = parts[0]
				for i in range(1, len(parts)):
					if names.has_key(name):
						del names[name]
					name = name+'.'+parts[i]
					
			self.requiredPackages = names.keys()
	
			cs = {}
			for c in self.classes.values():
				if not isinstance(c, org.python.core.PyJavaClass):
					continue
				name = c.__name__
				if name[:5] == 'java.': continue
				if name[:16] == 'org.python.core.': continue
				cs[c] = c
				
			depends = {}
			for c in cs.keys():
				print 'class', c, c.__name__
			
				depend(c.__name__, depends, self.dependFilter)
			
			for name, file in depends.items():
				print 'adding', name
				self.out.write(name, file)
		else:
			self.requiredPackages = None

		for javaclass, name, methods in self.javaclasses:
			if self.useProxy: methods = None
			self.makeJavaClass(javaclass, name, methods, main, not self.shallow)

	def addPackage(self, directory, skiplist=[]):
		for file in os.listdir(directory):
			if file[-6:] != '.class': continue
			name = 'org.python.core.'+file[:-6]
			if name in skiplist: continue
			
			self.out.write(name, os.path.join(directory, file))
from org.python.core import parser
from org.python.compiler.Module import compile
from org.python.compiler import JavaMaker
import org, java
import string, os

from FreezeVisitor import FreezeVisitor
from depend import depend

suffix = '$py'
prefix = 'pycode.'

class Freezer:
	def __init__(self, out, shallow=0, useProxy=0, dependFilter=None):
		self.proxies = {}
		self.modules = {}
		self.packages = {}
		
		self.classes = {}
		self.props = {}
		self.events = {}
		self.javaclasses = []
		
		self.out = out
		self.shallow = shallow
		self.dependFilter = dependFilter
		self.useProxy = useProxy

	def getPackage(self, package):
		fp = open(package.__file__, 'r')
		data = fp.read()
		fp.close()
		return data
		
	def freeze(self, myname, data=None, file='', package=None):
		print 'freezing', myname

		if data is None:
			package = __import__(myname)
			data = self.getPackage(package)
			if file == '':
				file = package.__file__

		f = FreezeVisitor(self.events, self.props, classes=self.classes, classname=myname)
		node = parser.parse(data, 'exec')
		f.suite(node)
				
		if not self.shallow:
			for proxy in f.proxies.values():
				#if proxy.__name__ != 'java.applet.Applet':
				self.proxies[proxy] = 1
						
			for package in f.packages.values():
				name = package.__name__
				if self.modules.has_key(package):
					continue
				elif hasattr(package, '__path__'):
					self.packages[package] = 1
				elif isinstance(package, org.python.core.PyModule):
					self.modules[package] = 1
					self.freeze(name, self.getPackage(package), package.__file__)
				else:
					self.packages[package] = 1
				
			ofp = java.io.ByteArrayOutputStream()
	
			nm = myname+suffix
			compile(node, ofp, nm, file, 1, 0)
			self.out.write(nm, ofp)
		
		if f.realclass != None:
			self.javaclasses.append( (f.realclass.__name__, myname, f.methods) )
			if self.useProxy:
				self.proxies[f.realclass] = 1
				
	def makeProxy(self, proxy):
		os = java.io.ByteArrayOutputStream()
		org.python.compiler.ProxyMaker.makeProxy(proxy, os)
		#print proxy, os, os.size()
		self.out.write('org.python.proxies.'+proxy, os)		


	def makeJavaClass(self, javaclass, myname, methods, main=0, frozen=1):
		#print methods
		jm = JavaMaker(javaclass, myname, myname, myname, 
					self.requiredPackages, 
					[], methods, frozen, main)
		jm.build()
		
		os = java.io.ByteArrayOutputStream()
		jm.classfile.write(os)
		self.out.write(myname, os)


	def finish(self, main=0):
		names = {}
		
		if not self.shallow:
			pkgText = "__path__ = []"
			pkgNode = parser.parse(pkgText, 'exec')
	
			for package in self.packages.keys():
				if isinstance(package, org.python.core.PyModule):
					myname = package.__name__
					ofp = java.io.ByteArrayOutputStream()
					compile(pkgNode, ofp, myname+suffix, package.__path__[0], 1, 0)
					self.out.write(myname+suffix, ofp)
					
					self.freeze(myname+'.__init__')
				else:
					names[package.__name__] = package
				
			for prop in self.props.keys():
				#print 'prop', prop
				if self.events.has_key(prop):
					print 'adding event', prop, self.events[prop]
					self.proxies[self.events[prop]] = 1	
			#print self.events
			
			# Make proxies
			for proxy in self.proxies.keys():
				self.makeProxy(proxy.__name__)
	
	
			for name in names.keys():
				parts = string.split(name, '.')
				name = parts[0]
				for i in range(1, len(parts)):
					if names.has_key(name):
						del names[name]
					name = name+'.'+parts[i]
					
			self.requiredPackages = names.keys()
	
			cs = {}
			for c in self.classes.values():
				if not isinstance(c, org.python.core.PyJavaClass):
					continue
				name = c.__name__
				if name[:5] == 'java.': continue
				if name[:16] == 'org.python.core.': continue
				cs[c] = c
				
			depends = {}
			for c in cs.keys():
				print 'class', c, c.__name__
			
				depend(c.__name__, depends, self.dependFilter)
			
			for name, file in depends.items():
				print 'adding', name
				self.out.write(name, file)
		else:
			self.requiredPackages = None

		for javaclass, name, methods in self.javaclasses:
			if self.useProxy: methods = None
			self.makeJavaClass(javaclass, name, methods, main, not self.shallow)

	def addPackage(self, directory, skiplist=[]):
		for file in os.listdir(directory):
			if file[-6:] != '.class': continue
			name = 'org.python.core.'+file[:-6]
			if name in skiplist: continue
			
			self.out.write(name, os.path.join(directory, file))
#if proxy.__name__ != 'java.applet.Applet': #print proxy, os, os.size() #print methods #print 'prop', prop #print self.events # Make proxies