It occurred to me that some details on how it works would be nice :)

In the Assembler.buildContainer system class there is a loop that deploys each ejbJar. In the top of that loop before the class loader for the ejbJar is created, I generate an additional jar file that contains all of the cmp2 concrete implementation classes. Then when the class loader is constructed for the application all of the cmp2 classes are available. The is means that we don't need any special hooks to get the JPA implementation to enhance our classes, and gives a good place to put our generated CMP persistence unit when I implement that feature :)

When I originally started coding this, I wanted to generate each cmp class and load it into the class loader directly one at a time. As it turns out that won't work because cmp classes have bidirectional relationships to each other and there is no way to load multiple classes into a class loader with one method class. Instead, you must generate a resource, something with a URL (normally a jar or directory) and add that to the class loader. Of course there is no standard method of for that either, so it turns out that generating a new jar before the class is created is the most elegant solution.

In the process of implementing this, I made a few other changes to make the generator simpler:

* Each CMP bean must have a persistence-unti-ref "openejb/cmp" which is persistence unit used by the cmp engine. In the future we will automatically generate and add the reference, but for now you must add it explicitly. * KenGenerator only has one method in the interface now. The other methods went to castor specific sub class. * All of the cmp2 generator stuff was moved to the org.apache.openejb.core.cmp.cmp2 package. * I removed the factory for the SingleValuedCmr and SetValuedCmr code. They were only there so concrete subclasses could be placed in the itests. * I as many generics as possible from the cmp2 generated sub class as it can create problems if the super class doesn't use generics also. * I left ExampleABean_JPA clases in the core tests directory as they are very useful for testing the generator against a know working example.
* We now have info objects for relationships

I still need to add a few things like (posting here so I don't forget)
* It would be nice to configure the name of the cmp2 concrete sub class to make switching to the ExampleABean_JPA.java file easier. * We should have a test case that Generates a cmp impl and attempts to load it. This catches any generation errors. * We should have a test that verifies the signatures of methods referenced by generated code hasn't changes. This will catch over zealous re-factoring.
* We need a CollectionValuedCmr

That is all I can think of now...

-dain

On Jan 3, 2007, at 8:31 PM, Dain Sundstrom wrote:

I just committed the CMP2 generator. It uses ASM directly and supports cmp fields, single valued cmr fields, and set valued cmrs. I still need to add support for ejbSelect methods and we should have a collection valued cmr handler (although treating them all as sets is legal).

All of the itest are using the cmp2 stuff.

-dain

Reply via email to