So if I am hearing you correctly, this may be possible at some point via 
AutoCreateDomainObjectContainer but not at this time because 
AutoCreateDomainObjectContainer is "not avialable"?

I see org.gradle.api.internal.AutoCreateDomainObjectContainer... So does "not 
available" just mean there is not a solid api/spi for it?


On Thursday, October 14, 2010, at 11:00 pm, Adam Murdoch wrote:
> On 14/10/2010, at 2:56 AM, Steve Ebersole wrote:
> > The jDocBook plugin currently makes an assumption that you have just a
> > single book per project.  If you have multiple books, you need to create
> > projects, one per book.   I want to change that to allow multiple books
> > per project.
> > 
> > However, this change entails some major changes to how configuration gets
> > defined and handled.
> > 
> > Currently an example configuration would look like:
> > 
> > jdocbook {
> > 
> >    masterSourceDocumentName = 'GradleUserGide.xml'
> >    translations = ['de-DE']
> >    format {
> >    
> >        name = 'html_single'
> >        finalName = 'index.html'
> >    
> >    }
> >    format {
> >    
> >        name = 'html'
> >        finalName = 'index.html'
> >    
> >    }
> >    format {
> >    
> >        name = 'pdf'
> >    
> >    }
> > 
> > }
> > 
> > Let's say I want to add a guide for plugin development as well.  I am
> > thinking that the config syntax that works the best in term of user feel
> > is:
> > 
> > jdocbook {
> > 
> >    translations = ['de-DE']
> >    format {
> >    
> >        name = 'html_single'
> >        finalName = 'index.html'
> >    
> >    }
> >    format {
> >    
> >        name = 'html'
> >        finalName = 'index.html'
> >    
> >    }
> >    
> >    userGuide {
> >    
> >        baseDirectory = 'src/main/jdocbook/userGuide'
> >        masterSourceDocumentName = 'GradleUserGide.xml'
> >        format {
> >        
> >            name = 'pdf'
> >        
> >        }
> >    
> >    }
> >    
> >    pluginDevGuide {
> >    
> >        baseDirectory = 'src/main/jdocbook/pluginDevGuide'
> >        masterSourceDocumentName = 'GradlePluginDevGide.xml'
> >    
> >    }
> > 
> > }
> > 
> > We have 2 specific guides here, the user guide and the plugin development
> > guide.  Each have some specific configuration as well as sharing some
> > common configuration.  Both have been translated into German; both
> > should get rendered
> > into html and html-single styles.
> 
> This is a very similar syntax that we use for configurations { } and
> sourceSets { }, so I think this is a good idea.
> 
> > So the difficulties... That syntax is extremely difficult (maybe just
> > given my poor Groovy skillz) to mesh with the existing syntax in terms
> > of applying it. So the first question is just how important
> > backwards-compatibility is here. If uber-important, i will need to
> > adjust the syntax i think accordingly since, as I said, its beyond my
> > Groovy skills to manage that here.
> > 
> > Also, I am not sure how the "book names" can be handled since they are
> > dynamic (not a discrete set).  Does this maybe need to be an explicit
> > Map syntax?  Or can I manage converting that syntax above into a Map
> > structure keyed by book name ("userGuide", "pluginDevGuide")?  Maybe via
> > creative use of delegate?
> 
> For configurations { } and sourceSets { }, the magic is all packaged up in
> AutoCreateDomainObjectContainer. It supports the above syntax for defining
> domain objects of a given type (books, I guess, in the jdocbook case).
> Plus it supports a bunch additional goodness. Some examples:
> 
> jdocbook {
>     userGuide {
>         // creates a Book called 'userGuide' if it does not exist then
> configures the book }
> }
> 
> // can get the books in various forms
> jdocbook.each { book -> println book }
> jdocbook.asMap
> 
> // books are available as a dynamic property
> assert jdocbook.userGuide.name == 'userGuide'
> assert jdocbook['userGuide'].name == 'userGuide'
> 
> // can add rules
> jdocbook.allObjects { book -> book.translations = ['de-DE']  }
> jdocbook.allObjects { book -> project.task("${book.name}Html") ... }
> 
> The idea is that (eventually) AutoCreateDomainObjectContainer and friends
> will take care of implementing the Gradle DSL so that the plugin doesn't
> need to care and is shielded from changes to the DSL. The plugin would
> simply declare that it needs a collection of named objects with a
> particular type.
> 
> The reality is not quite there, of course, in that
> AutoCreateDomainObjectContainer is an internal class, and there's no
> public API for implementing/creating one yet.
> 
> > Is it better to explicitly group the shared configuration in any way?
> > jdocbook {
> > 
> >    shared {
> >    
> >        translations = ['de-DE']
> >        format {
> >        
> >            name = 'html_single'
> >            finalName = 'index.html'
> >        
> >        }
> >        ...
> >    
> >    }
> >    ...
> > 
> > }
> > Does that gain me anything?
> 
> Possibly not from a DSL point of view. But it would be very simple to
> implement:
> 
> def shared(Closure cl) {
>     allObjects(cl)
> }
> 
> and you wouldn't need to do any magic in the Book class to take care of
> inheritance from the shared configuration.
> 
> It is also something we could add to AutoCreateDomainObjectContainer, so
> that the concept of 'shared' configuration would be available to each
> domain object container.
> 
> 
> --
> Adam Murdoch
> Gradle Developer
> http://www.gradle.org
> CTO, Gradle Inc. - Gradle Training, Support, Consulting
> http://www.gradle.biz

---
Steve Ebersole <[email protected]>
http://hibernate.org

---------------------------------------------------------------------
To unsubscribe from this list, please visit:

    http://xircles.codehaus.org/manage_email


Reply via email to