Aggregated cayenne.xml from several modules (projects)

3 messages Options
Embed this post
Permalink
Evgeny Ryabitskiy

Aggregated cayenne.xml from several modules (projects)

Reply Threaded More More options
Print post
Permalink
Hello to everyone!

I wonder if our cayenne is able to aggregate it's configuration from
several projects?

Like in my case I have several modules, each has it's configuration
like module1-cayenne.xml
So now root project need to get aggregated configuration from all modules.

So I'm trying to use DefaultConfiguration for each module.
The problem that after initialization configuration rewrites previous
and become singleton configuration (I need them all!)

Maybe I do something wrong or there no such feature?

Evgeny Ryabitskiy.
Andrus Adamchik

Re: Aggregated cayenne.xml from several modules (projects)

Reply Threaded More More options
Print post
Permalink
I was working on this exact problem, but due to the lack of time and  
some other priorities it got postponed till after 3.0. This Jira  
contains links to the design that I had in mind:

https://issues.apache.org/jira/browse/CAY-943

For 3.1 I actually have more radical ideas, so it may look different  
at the end. Anyways, all the complexity of this task is due to the  
need to handle a general case of merging multiple descriptors and  
resolve arising conflicts. If you know that your configuration does  
not have any such conflicts, it should be reasonably simple to merge  
things by hand. Here is a rough example (this is for 3.0, some things  
may be different in 2.0):


Configuration myConfig = new Configuration() {
    // override all abstract methods to do nothing
}

ClassLoader cl = .. // get a thread class loader

// assuming all Cayenne projects are at the root of the classpath:
Enumeration<URL> projectURLs = cl.indResources("cayenne.xml");
while(projectURLs.hasMoreElements()) {
    URL baseURL = projectURLs.nextElement();


    ResourceLocator resourceLocator = new ResourceLocator() {
         // override locator methods as appropriate... e.g.:
         public URL getResource(String name) {
           if(name.equals("cayenne.xml") {
             return baseURL;
           }

           // assuming there's no conflciting DataMap names
           return super.getResource(name);
          }

    } ;
    Configuration scratchConfig = new  
DefaultConfiguration("cayenne.xml", resourceLocator);

    // move all DataMaps from scratchConfig to myConfig
    // move all DataNodes from scratchConfig to myConfig
}

Configuration.initializeSharedConfiguration(myConfig);


Andrus

On Oct 21, 2009, at 7:12 PM, Evgeny Ryabitskiy wrote:

> Hello to everyone!
>
> I wonder if our cayenne is able to aggregate it's configuration from
> several projects?
>
> Like in my case I have several modules, each has it's configuration
> like module1-cayenne.xml
> So now root project need to get aggregated configuration from all  
> modules.
>
> So I'm trying to use DefaultConfiguration for each module.
> The problem that after initialization configuration rewrites previous
> and become singleton configuration (I need them all!)
>
> Maybe I do something wrong or there no such feature?
>
> Evgeny Ryabitskiy.
>

Evgeny Ryabitskiy

Re: Aggregated cayenne.xml from several modules (projects)

Reply Threaded More More options
Print post
Permalink
I have create an issue to solve this problem, solution is published.
It's working but there some open subissue described in comments.

Evgeny.

2009/10/22 Andrus Adamchik <[hidden email]>:

> I was working on this exact problem, but due to the lack of time and some
> other priorities it got postponed till after 3.0. This Jira contains links
> to the design that I had in mind:
>
> https://issues.apache.org/jira/browse/CAY-943
>
> For 3.1 I actually have more radical ideas, so it may look different at the
> end. Anyways, all the complexity of this task is due to the need to handle a
> general case of merging multiple descriptors and resolve arising conflicts.
> If you know that your configuration does not have any such conflicts, it
> should be reasonably simple to merge things by hand. Here is a rough example
> (this is for 3.0, some things may be different in 2.0):
>
>
> Configuration myConfig = new Configuration() {
>   // override all abstract methods to do nothing
> }
>
> ClassLoader cl = .. // get a thread class loader
>
> // assuming all Cayenne projects are at the root of the classpath:
> Enumeration<URL> projectURLs = cl.indResources("cayenne.xml");
> while(projectURLs.hasMoreElements()) {
>   URL baseURL = projectURLs.nextElement();
>
>
>   ResourceLocator resourceLocator = new ResourceLocator() {
>        // override locator methods as appropriate... e.g.:
>        public URL getResource(String name) {
>          if(name.equals("cayenne.xml") {
>            return baseURL;
>          }
>
>          // assuming there's no conflciting DataMap names
>          return super.getResource(name);
>         }
>
>   } ;
>   Configuration scratchConfig = new DefaultConfiguration("cayenne.xml",
> resourceLocator);
>
>   // move all DataMaps from scratchConfig to myConfig
>   // move all DataNodes from scratchConfig to myConfig
> }
>
> Configuration.initializeSharedConfiguration(myConfig);
>
>
> Andrus
>
> On Oct 21, 2009, at 7:12 PM, Evgeny Ryabitskiy wrote:
>
>> Hello to everyone!
>>
>> I wonder if our cayenne is able to aggregate it's configuration from
>> several projects?
>>
>> Like in my case I have several modules, each has it's configuration
>> like module1-cayenne.xml
>> So now root project need to get aggregated configuration from all modules.
>>
>> So I'm trying to use DefaultConfiguration for each module.
>> The problem that after initialization configuration rewrites previous
>> and become singleton configuration (I need them all!)
>>
>> Maybe I do something wrong or there no such feature?
>>
>> Evgeny Ryabitskiy.
>>
>
>