#!/usr/bin/env jpython import sys import java from java.awt import BorderLayout, GridLayout import jacomma from jacomma.icm.type import Handle, Symbol from jacomma.platform.core import Agent, AgentManager, MessagePattern, AgentObserverAdapter import javax from javax.swing import * class messenger( java.awt.event.ActionListener ): def __init__( self, mf, agent ): self.mf_ = mf self.agent_ = agent def actionPerformed( self, evt ): l = java.util.ArrayList() l.add( Symbol( "broadcast" ) ) l.add( self.mf_.getText() ) self.agent_.send( self.agent_.getProperty( "target" ), l ) class window_listener( java.awt.event.WindowAdapter ): def __init__( self, agent ): self.agent_ = agent def windowClosing( self, evt ): self.agent_.send( self.agent_.getProperty( "target" ), Symbol( "unregister" ) ) self.agent_.destroy() AgentManager.instance.stopEngine() java.lang.System.exit( 0 ) class msg_handler( Agent.MessageHandler ): def onMessage( self, agent, msg ): print "Incoming Message:", msg cnt = msg.getContent() buf = java.lang.StringBuffer() buf.append( cnt.get( 1 ) ).append( ": " ).append( cnt.get( 2 ) ) buf.append( "\n" ) SwingUtilities.invokeLater( gui_update( agent.getProperty( "messages" ),\ buf.toString() ) ) class msg_test( java.lang.Object ) : def equals( self, msg ) : l = msg.getContent() return java.util.List.isInstance( l ) \ and l.size() == 3 \ and l.get( 0 ).equals( Symbol( "message" ) ) \ and Handle.isInstance( l.get( 1 ) ) class gui_update( java.lang.Runnable ): def __init__( self, ml, msg ): self.ml_ = ml self.msg_ = msg def run( self ): self.ml_.append( self.msg_ ) class ag_observer( AgentObserverAdapter ): def __init__( self, target ): self.target_ = target def onRegisteredAgent( self, agent, host ): agent.setProperty( "target", self.target_ ) agent.registerHandler( MessagePattern.createPattern( java.util.List, msg_test()), \ msg_handler() ) # register the agent f = make_gui( agent ) f.pack() f.show() agent.send( self.target_, Symbol( "register" ) ) def make_gui( agent ) : f = JFrame( agent.getHandle().toString() ) f.addWindowListener( window_listener( agent ) ) ml = JTextArea( 20, 20 ) ml.setEditable( 0 ) ml.setBorder( BorderFactory.createEtchedBorder() ) agent.setProperty( "messages",ml ) mf = JTextField( 15 ) mb = JButton( "send!" ) mb.addActionListener( messenger( mf, agent ) ) pf = JPanel( GridLayout( 1, 2) ) pf.setBorder( BorderFactory.createEtchedBorder() ) pf.add( mf ) pf.add( mb ) p = JPanel( BorderLayout() ) p.setBorder( BorderFactory.createEtchedBorder() ) p.add( JScrollPane( ml ), BorderLayout.CENTER ) p.add( pf, BorderLayout.SOUTH ) f.getContentPane().add( p ) return f # params: agent-name, hub-name host = java.net.InetAddress.getByName( sys.argv[3] ) target = Handle.createHandle( sys.argv[2], host ) ag = AgentManager.instance.createAgent( sys.argv[1], ag_observer( target ) )