예제 #1
0
    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]) ) )
예제 #2
0
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()