You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomee.apache.org by Dain Sundstrom <da...@iq80.com> on 2007/01/04 05:31:24 UTC
CMP2 generator
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
Re: CMP2 generator
Posted by Dain Sundstrom <da...@iq80.com>.
One more thing... I expect many-to-many relationships to Just Work
(TM), but I think unidirectional relationships won't.
We have tests for these, but they haven't been updated to OpenEJB 3 yet.
-dain
On Jan 3, 2007, at 9:13 PM, Dain Sundstrom wrote:
> 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
Re: CMP2 generator
Posted by Dain Sundstrom <da...@iq80.com>.
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