package com.odelia.jxta import net.jxta.platform.ModuleClassID import net.jxta.platform.ModuleSpecID import net.jxta.document.Advertisement import net.jxta.document.AdvertisementFactory import net.jxta.id.ID import net.jxta.id.IDFactory import net.jxta.peergroup.PeerGroup import net.jxta.peergroup.PeerGroupID import net.jxta.protocol.ModuleSpecAdvertisement import net.jxta.protocol.ModuleImplAdvertisement import net.jxta.protocol.PipeAdvertisement import net.jxta.service.Service import net.jxta.pipe.PipeService import net.jxta.pipe.PipeMsgListener import net.jxta.util.JxtaServerPipe import net.jxta.impl.peergroup.StdPeerGroup import net.jxta.impl.protocol.ModuleImplAdv class GroovyJXTAService implements Service { static final def NAME = 'Service GroovyJXTAService' static final def MODULE_CLASS_URI = 'urn:jxta:uuid-C8752B6693904132ACCB84559A6D380905' static final def MODULE_SPEC_URI = 'urn:jxta:uuid-C8752B6693904132ACCB84559A6D3809F560A94E8EA744E98823AF2B4501AA5006' static def classID = ModuleClassID.create(new URI(MODULE_CLASS_URI)) static def specID = ModuleSpecID.create(new URI(MODULE_SPEC_URI)) private def group private def assignedID private def implAdv private def serverPipe private def groovyShell = new GroovyShell() private def script static PipeAdvertisement getPipeAdvertisement() { def pipeAdv = AdvertisementFactory.newAdvertisement(PipeAdvertisement.advertisementType) def ID = IDFactory.newPipeID(PeerGroupID.defaultNetPeerGroupID, NAME.bytes) pipeAdv.with { pipeID = ID type = PipeService.UnicastType name = 'Pipe service GroovyJXTAService' description = "Créé par $NAME" } pipeAdv } static ModuleSpecAdvertisement getModuleSpecAdvertisement() { def moduleSpecAdv = AdvertisementFactory.newAdvertisement(ModuleSpecAdvertisement.getAdvertisementType()); moduleSpecAdv.with { creator = 'odelia technologies' description = 'Service GroovyJXTAService' moduleSpecID = specID version = '1.0' pipeAdvertisement = getPipeAdvertisement() } moduleSpecAdv } static Advertisement getModuleImplAdvertisement() { def moduleImplAdv = AdvertisementFactory.newAdvertisement(ModuleImplAdvertisement.advertisementType) as ModuleImplAdvertisement moduleImplAdv.with { description = 'Service GroovyJXTAService' moduleSpecID = specID provider = NAME code = GroovyJXTAService.class.name compat = StdPeerGroup.STD_COMPAT uri = 'http://www.odelia-technologies.com/jxgroovy/jxgroovy-1.0-SNAPSHOT.jar' } moduleImplAdv } Advertisement getImplAdvertisement() { implAdv } Service getInterface() { return this } void init(PeerGroup group, ID assignedID, Advertisement implAdv) { this.group = group this.assignedID = assignedID this.implAdv = implAdv } int startApp(String[] args) { script = groovyShell.parse(args[0]) try { serverPipe = new JxtaServerPipe(group, getPipeAdvertisement(), 5000) Thread.start { while (serverPipe) { try { def biDiPipe = serverPipe.accept() if (biDiPipe) { // Un thread pourrait être utilisé ici biDiPipe.messageListener = { event -> println "biDiPipe.messageListener !" groovyShell.setVariable('pipe', biDiPipe) groovyShell.setVariable('event', event) script.run() biDiPipe.close() } as PipeMsgListener } } catch (SocketTimeoutException e) { } catch (IOException ioe) { // Tracer } } } return START_OK } catch (IOException e) { // Tracer return START_DISABLED } } public void stopApp() { if (serverPipe) { try { serverPipe.close() serverPipe = null } catch (IOException e) { // Tracer } } } }