Odelia>Technologies

MetaBuilder, un builder de builders Groovy

| |

Comme son nom l'indique, MetaBuilder est un constructeur de builders Groovy, et facilite grandement l'implémentation de nouveaux builders en langage Groovy.
Pour en donner une illustration concrète, nous expliquons dans cet article quelques détails de l'implémentation d'un builder, ServiceAssemblyBuilder, destiné à générer des archives de type Service Assembly (SA) de la spécification JBI (Java Business Integration, JSR-208).

En langage Groovy, il existe au moins deux manières d'implémenter un builder : les sous classements des classes BuilderSupport et FactoryBuilderSupport du package groovy.util.
L'utilisation de la classe MetaBuilder offre une approche élégante de création de builders, par la définition de votre propre DSL (Domain-Specific Language), à laquelle est associée des règles de contrôle et d'accès ; ceci dans le but de construire une arborescence d'objets dont l'utilité s'exprimera au travers d'une ou de plusieurs méthodes du builder.


Le builder de Service Assembly JBI

Le but du builder ServiceAssembly va être de pouvoir créer facilement des archives de type Service Assembly conformes à la spécification JBI.
Un SA JBI doit comprendre le fichier de description jbi.xml, et contenir des archives JBI de type Service Unit (SU) contenant elles-mêmes d'autres fichiers.
En réalité, l'implémentation du builder ServiceAssemblyBuilder a recours à trois autres builders : MetaBuilder bien sûr, AntBuilder (pour la création des archives), et MarkupBuilder (pour la création du fichier jbi.xml) !

Voici comment le builder ServiceAssemblyBuilder permet de définir un SA comprenant deux SUs :

ServiceAssembly {
    name = 'GroovySA'
    description: 'Un service Groovy exposé en HTTP'
        ServiceUnit {
            name = 'HTTP-BC'
            target = 'servicemix-http'   
            Artifact { filename = 'xbean.xml' }      
        }                                                                      
        ServiceUnit() {
            name = 'GroovyService'
            target = 'servicemix-scripting'     
            Artifact { filename = 'ExempleGroovy.groovy' }
            Artifact {filename = 'xbean1.xml' }
        }
}

Cette définition de SA peut être utilisée de deux manières : soit en tant que Closure, soit sous la forme de fichier. En effet, la classe ServiceAssemblyBuilder possède deux méthodes de même nom, build, prenant chacune deux arguments, le premier argument étant le nom de l'archive JBI SA à créer ; le second argument est, pour la première méthode, une Closure définissant le SA, et pour la seconde méthode, un fichier contenant la définition d'un SA.
Si SABuilder représente un objet de type ServiceAssemblyBuilder, une archive JBI SA pourrait être créée ainsi :

SABuilder.build(new File('GroovySA.zip'), {
    ServiceAssembly {
        … // definition du SA
    }
}

En ayant une définition de Service Assembly sous la forme de fichier, une archive SA serait créer de la manière suivante :

SABuilder.build(new File('GroovySA.zip', new File('SA.groovy'))

Vous pouvez récupérer le code source de la classe ServiceAssemblyBuilder définie dans le fichier ServiceAssemblyBuilder.groovy qui est en pièce jointe à cet article, ainsi que la librairie sa-builder-1.0-SNAPSHOT.jar.
Grâce à cette librairie et la fonction main définie dans la classe ServiceAssemblyBuilder, vous pourrez lancer la génération d'un SA, à partir d'une invite de commandes, par un appel de la forme :

java com.odelia.sm.ServiceAssemblyBuilder <archive_sa.zip> <sa.groovy>

Pour que cela fonctionne, il faut avoir les librairies suivantes accessibles dans le CLASSPATH Java : groovy-all-1.5.x.jar, groovytools-builder-1.1.4.jar, ant-1.7.0.jar, ant-launcher-1.7.0.jar et sa-builder-1.0-SNAPSHOT.jar (bien sûr, des versions supérieures de ces librairies devraient également fonctionner).

Fichier attachéTaille
sa-builder-1.0-SNAPSHOT.jar121.74 Ko
ServiceAssembyBuilder.groovy4.35 Ko

balises dans Langages et systèmes

AJAX cajo Camel DSL Grails Groovy GSP Java JBI RSS ServiceMix SOA