[jboss-dev] JBoss Bootstrap, Embedded & Reloaded

Emmanuel Bernard emmanuel.bernard at jboss.com
Thu Apr 16 06:12:01 EDT 2009


> Okay, here we go: http://anonsvn.jboss.org/repos/jbossas/projects/ejb3/trunk/embedded/src/test/java/org/jboss/ejb3/embedded/test/jpa/unit/PhoneBookTestCase.java
>
> For inspiration I used: http://martinfowler.com/dslwip/
>
> A couple of guidelines I'm forming:
> - for each domain object we want a builder
> - static methods of a builder should return the domain object
> - other methods of a builder should return this
>
> Step by step:
> on(container)  // does a cast to JBossEJBContainer so we can get to  
> the extended API.
> .deploy(  // deploy
>    deployment(  // a deployment
>       url, // which is based at url
>       persistence( // and has a persistence attachment
>          unit("tempdb")  // consisting of persistence unit tempdb
>             .jtaDataSource("java:/Default")
>             .property("hibernate.hbm2ddl.auto", "create-drop")
>          )
>       )
>    );
>
> The extra deployment() might seem trivial, but there is a decoupling  
> between the main deployer and the deployment types, so right now I'm  
> using a VFSDeploymentBuilder.
> ( http://anonsvn.jboss.org/repos/jbossas/projects/ejb3/trunk/embedded/src/main/java/org/jboss/ejb3/embedded/dsl/DeploymentBuilder.java 
>  )
>
> Persistence units can be added in two different ways:
> 1. nested function as shown about
> 2. method chaining:
>  persistence().unit("tempdb1").unit("tempdb2")
>
> The same goes for the properties on an unit.
>
> So the question is: who should own the builders for JPA?
>
> http://anonsvn.jboss.org/repos/jbossas/projects/ejb3/trunk/embedded/src/test/java/org/jboss/ejb3/embedded/test/dsl/PersistenceBuilder.java
> http://anonsvn.jboss.org/repos/jbossas/projects/ejb3/trunk/embedded/src/test/java/org/jboss/ejb3/embedded/test/dsl/PersistenceUnitBuilder.java
>
> Carlo
> --
> note to self: requirement 'd' already proves that there can't be a  
> grand API project for this.

Sweet.

I am a bit puzzled at the use of static imports (in general in Java).

I've found that it makes things a bit harder in the sense that one has  
to know which class or element to statically import to use it. So when  
combined with a fluent API design, it literally destroys the flow of  
the API at least at write time. When using the fluent API + contextual  
objects in lieu of parameters when subsequent informations are  
provider, the IDE helps a great deal by proposing the solutions (see  
below).

on()
I think the EJB 3.1 spec would benefit from a
EJB3Container.unwrap(JBossEJB3Container.class).deploy(...);
on() is nice but again, you need to know it exists.

deploy()
what's the reason for

deploy 
( DeploymentBuilder.deployment( NonXADataSourceDeploymentMetaData.class,
                DataSourceBuilder.localDatasource()
                        .driverClass(String)
                        .getMedatata() ) )

vs
deploy()
     .datasource("name")
         .local()
         .driver(HSQLDBService.class)
     .application()
         .persistence("pu-customer")
           .package( pkg("org.jboss.ejb3.embedded.test.jpa") )
           .jtaDatasource("name")
           .property("hibernate.hbm2ddl.auto", "create-drop");

I understand the need for a generic deployment thingy for things not  
provided OOTB by the configuration API but by providing built-in  
support for key deployments (datasource, jms queue, war etc), we make  
things easier it seems. I wish we could provide a natural way to  
extend the configuration providing both OOTB style API and  
extensibility. I haven't found a solution yet but generics might help  
here (the main problem is extending for multiple usecases - extending  
for one usecase is easy).

driverClass(), could it take Class<? extends ...> instead of a string?

Emmanuel



More information about the jboss-development mailing list