My favorites | Sign in
Project Home Downloads Wiki Issues Source
Project Information
Members
Featured
Downloads
Links

Welcome to Jynx

What is Jynx?

Jynx is a Jython library used to improve integration of Java with Python in three important ways:

  • Dynamic creation, compilation and loading of Java classes.
  • Extraction of Java proxy classes from Python classes.
  • Support of compile time Java features like annotations from within Jython.

Those features enable the utilization of modern annotation based Java frameworks from Jython.

News

2009-09-04 Jynx 0.4 released

  • Hibernate support
  • Embedded Java parser
  • bean_property decorator
  • improved class-file detection heuristics in dynamic compilation

2009-08-12 Jynx 0.3 released

  • No enforced disk dump for dynamically compiled classes.

2009-07-27 Jynx 0.2 released

2009-07-10 Jynx 0.1 released

Examples

The following Python script creates a Java class with a @Test annotation and runs a test inside of the JUnit 4 framework:

import jynx
from java.lang import Object
from jynx.lib.junit import*
from jynx.jannotations import*

@JavaClass
class JavaCompilerTest(Object):
    @Test
    def simpleClassTest(self):
        source = '''
        import java.util.Random;
        class A {
            int getInt()
            {
                return new Random().nextInt(2);
            }
        }
        '''
        A = JavaCompiler().createClass("A", source)
        for i in range(100):
            n = A().getInt()
            assertTrue(isinstance(n, int))
            assertTrue(0<=n<=1)

if __name__ == '__main__':
    runClasses(JavaCompilerTest)

Quite complex frameworks like Hibernate are supported as well. The following code defines two entity beans with a one-to-many relationship. Sessions and transactions are wrapped into ContextManagers for with-statements:

import jynx
from java.lang import Object
from jynx.lib.junit import*
from jynx.jannotations import*

@Entity
class S(Serializable):
    @Id
    @GeneratedValue
    @bean_property("int")
    def id(_):_

    @bean_property("String")
    def name(self): pass

@Entity
class T(Serializable):
    @Id
    @GeneratedValue
    @bean_property(int)
    def id(self):pass

    @bean_property("String")
    def name(self): pass

    @OneToMany
    @bean_property("Set<S>")
    def s(self):pass

@JavaClass
class OneToManyTest(Object):
    @Test
    def testUnidirectionalDefault(self):

        t = T()
        t.name = "T"
        s1 = S()
        s1.name = "S1"
        s2 = S()
        s2.name = "S2"
        t.s = set()

        with hn_session(S, T) as session:
            with hn_transact(session):
                session.persist( t )
                session.persist( s1 )
                session.persist( s2 )
                t.s.add( s1 )
                t.s.add( s2 )


        with hn_session(S, T) as session:
            tx = session.beginTransaction()
            t = session.get( T, t.id )
            assertEquals( 2, t.s.size() )
            tx.rollback();

runClasses(OneToManyTest)
Powered by Google Project Hosting