package com.odelia.sm import groovytools.builder.MetaBuilder import groovy.xml.MarkupBuilder class ServiceAssembly { def name def description def serviceUnits = [] } class ServiceUnit { def name def description def target def artifacts = [] } class Artifact { def filename } class ServiceAssemblyBuilder { private def mb = new MetaBuilder() private def ant = new AntBuilder() ServiceAssemblyBuilder() { mb.define { ServiceAssembly(factory: ServiceAssembly) { properties { name(req: true) description() } collections { ServiceUnits(collection: {o -> o.serviceUnits}, min: 1) { ServiceUnit(factory: ServiceUnit) { properties { name(req: true) description() target(req: true) } collections { Artifacts(collection: {o -> o.artifacts}, min: 1) { Artifact(factory: Artifact) { properties() { filename() } } } } } } } } } } def buildSA(File saDef, File file) { def binding = new Binding([builder: this, file: file]) def shell = new GroovyShell(binding) shell.evaluate("""builder.buildSA(file) { ${saDef.text} }""") } def build(File file, Closure c) { buildSA(file, mb.build(c)) } def build(File file, File definition) { buildSA(file, mb.build(definition.toURL())) } private def buildSA(File file, Object sa) { // Créer un répertoire temporaire def tempFile = File.createTempFile("sm-sa", "") tempFile.delete() String repTemporaire = tempFile.getAbsolutePath() try { // Créer le répertoire de travail si nécessaire ant.mkdir(dir: repTemporaire) // Créer le répertoire sa servant à créer l'archive du service-assembly String repSA = repTemporaire + "/sa/" ant.mkdir(dir: repSA) // Créer l'archive de chaque service-unit def i = 1 sa.serviceUnits.each { descSU -> // Créer le répertoire su servant à créer l'archive du service-unit String repSU = "${repTemporaire}/su${i}/" ant.mkdir(dir: repSU) // Copier les artefacts du SU descSU.artifacts.each { elm -> ant.copy(file: elm.@filename, todir: repSU) } // Créer le fichier zip su.zip ant.zip(basedir: repSU, destfile: repSA + "su${i}.zip") i++ } // Créer l'archive du service-assembly // Créer le répertoire META-INF qui contiendra le fichier jbi.xml ant.mkdir(dir: repSA + "META-INF") // Créer le fichier jbi.xml def writer = new FileWriter(new File(repSA + "META-INF/jbi.xml")) def builder = new MarkupBuilder(writer) builder.jbi(xmlns: "http://java.sun.com/xml/ns/jbi", version: "1.0") { "service-assembly"() { identification() { name(sa.name) description(sa.description ?: sa.name) } i = 1 sa.serviceUnits.each { descSU -> builder."service-unit"() { identification() { name(descSU.name) description(descSU.description ?: descSU.name) } target() { "artifacts-zip"("su${i++}.zip") "component-name"(descSU.target) } } } } } writer.close() // cela crée le fichier jbi.xml // Créer l'archive SA ant.zip(basedir: repSA, destfile: file.canonicalPath) } finally { // Suppression du répertoire temporaire et de son contenu ant.delete(includeemptydirs: "true") { ant.fileset(dir: repTemporaire) } } } static void main(String[] args) { if (args.length != 2) { println 'Utilisation : ServiceAssembly ' System.exit(0) } def builder = new ServiceAssemblyBuilder() builder.build(new File(args[0]), new File(args[1])) } }