def __init__(self,fname,srcdir='.'): self.fname = fname self.srcdir = srcdir ast = parse_java(os.path.join(srcdir,fname)) ast.concat_ids().pythonize() cu = ast.CompilationUnit self.package = None pn = ast.PackageDec.PackageName if pn: self.package = ".".join(pn[0]) self.classes = [] self.interfaces = [] for d in cu[2]: if d.name == 'ClassDec': self.classes.append(Java_Class(d)) if d.name == 'InterfaceDec': self.interfaces.append(Java_Interface(d)) # print pp_aterm(d) self.imports = [] for i in cu[1]: if i.name == "TypeImportOnDemandDec": self.imports.append( "%s.*" % ".".join(i.PackageName[0]) ) else: self.imports.append( "%s.%s" % ( str(i.TypeName[0]), str(i.TypeName[1]) ) )
def package2py(basedir,pkg=None,outbase=None,recursive=True): """ translates all java src in pkg to python, writes py src into outbase/pkg """ if outbase is None: outbase = os.path.join(basedir,"..","py") logger.debug(pkg) #figure out output dir outpkg = rename_pkg(pkg) pkgdir = os.path.join(basedir,pkg.replace(".",os.path.sep)) if outpkg is None: outdir = outbase else: outdir = os.path.join(outbase,outpkg.replace(".",os.path.sep)) if not os.path.isdir(outdir): os.makedirs(outdir) logger.info("starting java2py") logger.info(" pkgdir: %s",pkgdir) logger.info(" outdir: %s",outdir) pi = pkginfo.PackageInfo.load(basedir,pkg) #make __init__.py of = open(os.path.join(outdir,"__init__.py"),"w") of.write('''#-*- coding:utf-8 -*-\n"""%s"""\n''' % pi.doc) of.write('\n#public classes:\n') for c in pi.public_classes(): of.write('from %s import %s\n' % (c.name,c.name) ) of.write('\n#public interfaces:\n') for i in pi.public_interfaces(): of.write('from %s import %s\n' % (i.name,i.name) ) of.close() for n in os.listdir(pkgdir): if recursive and os.path.isdir(os.path.join(pkgdir,n)) \ and not n.startswith('.') \ and (True or os.path.exists(os.path.join(pkgdir,n,'package.html'))): package2py(basedir,pkg+"."+n,outbase,True) elif n.endswith(".java"): print "translating",n ast = java_front.parse_java(os.path.join(pkgdir,n)) if save_intermediates: f = codecs.open(os.path.join(outdir,n+".aterm"),"w","utf8") f.write(java_front.pp_aterm(ast)) f.close() j2py.run(ast) #todo: add package imports if save_intermediates: f = codecs.open(os.path.join(outdir,n+".j2py.aterm"),"w","utf8") s = java_front.pp_aterm(ast) f.write(s) f.close() py_ast = java_front.java2py(ast) if save_intermediates: f = codecs.open(os.path.join(outdir,n+".box"),"w","utf8") s = java_front.pp_aterm(py_ast) f.write(s) f.close() py = java_front.abox2text(py_ast) py = py.split("\n") #skip skip = config['skip'] def keep(l): ls = l.strip() if ls in skip: return False for s in skip: if ls.startswith(s): return False return True res = [ l for l in filter(keep,py) ] py = "\n".join(res) pyfn = n.replace('.java','.py') f = codecs.open(os.path.join(outdir,pyfn),'w','utf8') f.write(py) f.close()