From: <jom...@us...> - 2014-09-13 23:50:31
|
Revision: 1801 http://sourceforge.net/p/jason/svn/1801 Author: jomifred Date: 2014-09-13 23:50:27 +0000 (Sat, 13 Sep 2014) Log Message: ----------- initial impl of REPL for Jason Modified Paths: -------------- trunk/build.xml trunk/src/jason/asSemantics/Agent.java trunk/src/jason/infra/centralised/RunCentralisedMAS.java Added Paths: ----------- trunk/src/jason/infra/repl/ trunk/src/jason/infra/repl/ReplAg.java trunk/src/jason/infra/repl/clear.java trunk/src/jason/infra/repl/mi.java trunk/src/jason/infra/repl/print_unifier.java trunk/src/jason/infra/repl/verbose.java Modified: trunk/build.xml =================================================================== --- trunk/build.xml 2014-09-11 12:20:36 UTC (rev 1800) +++ trunk/build.xml 2014-09-13 23:50:27 UTC (rev 1801) @@ -7,6 +7,7 @@ <property name="jasonJar" value="${basedir}/lib/jason.jar" /> <property name="jadeJar" value="${basedir}/lib/jade.jar" /> <property name="jasonSJar" value="${basedir}/lib/s-jason.jar" /> + <property name="replJar" value="${basedir}/lib/jason-repl.jar" /> <property name="build.dir" value="${basedir}/bin/classes" /> @@ -167,6 +168,25 @@ </jar> <!-- copy file="${jasonJar}" todir="applications/jason-eclipse-plugin/lib" /--> </target> + + <target name="repl" depends="jar" > + <delete file="${replJar}" /> + <copy file="${jasonJar}" tofile="${replJar}" /> + <echo file="default.mas2j"> + MAS repl { + agents: repl_agent agentClass jason.infra.repl.ReplAg; + } + </echo> + <jar update="yes" jarfile="${replJar}" > + <fileset dir="${basedir}"> + <include name="default.mas2j" /> + </fileset> + <manifest> + <attribute name="Main-Class" value="jason.infra.centralised.RunCentralisedMAS"/> + </manifest> + </jar> + <!--delete file="default.mas2j" /--> + </target> <target name="signjar" depends="jar"> <copy file="${jasonJar}" tofile="${jasonSJar}" /> Modified: trunk/src/jason/asSemantics/Agent.java =================================================================== --- trunk/src/jason/asSemantics/Agent.java 2014-09-11 12:20:36 UTC (rev 1800) +++ trunk/src/jason/asSemantics/Agent.java 2014-09-13 23:50:27 UTC (rev 1801) @@ -127,15 +127,21 @@ new TransitionSystem(ag, null, stts, arch); - BeliefBase bb = (BeliefBase) Class.forName(bbPars.getClassName()).newInstance(); + BeliefBase bb = null; + if (bbPars == null) + bb = new DefaultBeliefBase(); + else + bb = (BeliefBase) Class.forName(bbPars.getClassName()).newInstance(); + ag.setBB(bb); // the agent's BB have to be already set for the BB initialisation ag.initAg(); - bb.init(ag, bbPars.getParametersArray()); + if (bbPars != null) + bb.init(ag, bbPars.getParametersArray()); ag.load(asSrc); // load the source code of the agent return ag; } catch (Exception e) { - throw new JasonException("as2j: error creating the customised Agent class! - ", e); + throw new JasonException("as2j: error creating the customised Agent class! - "+agClass, e); } } Modified: trunk/src/jason/infra/centralised/RunCentralisedMAS.java =================================================================== --- trunk/src/jason/infra/centralised/RunCentralisedMAS.java 2014-09-11 12:20:36 UTC (rev 1800) +++ trunk/src/jason/infra/centralised/RunCentralisedMAS.java 2014-09-13 23:50:27 UTC (rev 1801) @@ -28,6 +28,7 @@ import jason.asSyntax.directives.DirectiveProcessor; import jason.asSyntax.directives.Include; import jason.control.ExecutionControlGUI; +import jason.infra.repl.ReplAg; import jason.jeditplugin.Config; import jason.mas2j.AgentParameters; import jason.mas2j.ClassParameters; @@ -38,6 +39,7 @@ import jason.runtime.MASConsoleLogHandler; import jason.runtime.Settings; +import java.awt.FlowLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.File; @@ -67,6 +69,7 @@ import javax.swing.JScrollPane; import javax.swing.JTabbedPane; import javax.swing.JTextArea; +import javax.swing.JTextField; /** * Runs MASProject using centralised infrastructure. @@ -311,7 +314,9 @@ new KillAgentGUI(MASConsoleGUI.get().getFrame(), "Kill an agent of the current MAS"); } }); - MASConsoleGUI.get().addButton(btKillAg); + MASConsoleGUI.get().addButton(btKillAg); + + createNewReplAgButton(); } protected void createPauseButton() { @@ -343,6 +348,45 @@ MASConsoleGUI.get().addButton(btStop); } + protected void createNewReplAgButton() { + // add Button debug + final JButton btStartAg = new JButton("New REPL agent", new ImageIcon(RunCentralisedMAS.class.getResource("/images/newAgent.gif"))); + btStartAg.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent evt) { + final JFrame f = new JFrame("New REPL Agent, give it a name"); + //f.getContentPane().setLayout(new BorderLayout()); + //f.getContentPane().add(BorderLayout.NORTH,command); + //f.getContentPane().add(BorderLayout.CENTER,mindPanel); + final JTextField n = new JTextField(30); + n.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + f.setVisible(false); + + CentralisedAgArch agArch = new CentralisedAgArch(); + agArch.setAgName(n.getText()); + agArch.setEnvInfraTier(env); + try { + agArch.createArchs(null, ReplAg.class.getName(), null, null, new Settings(), RunCentralisedMAS.this); + Thread agThread = new Thread(agArch); + agArch.setThread(agThread); + agThread.start(); + } catch (JasonException e1) { + e1.printStackTrace(); + } + addAg(agArch); + } + }); + f.setLayout(new FlowLayout()); + f.add(n); + f.pack(); + f.setLocation((int)btStartAg.getLocationOnScreen().x, (int)btStartAg.getLocationOnScreen().y+30); + f.setVisible(true); + } + }); + MASConsoleGUI.get().addButton(btStartAg); + } + public static RunCentralisedMAS getRunner() { return runner; } Added: trunk/src/jason/infra/repl/ReplAg.java =================================================================== --- trunk/src/jason/infra/repl/ReplAg.java (rev 0) +++ trunk/src/jason/infra/repl/ReplAg.java 2014-09-13 23:50:27 UTC (rev 1801) @@ -0,0 +1,181 @@ +package jason.infra.repl; + +import jason.JasonException; +import jason.asSemantics.Agent; +import jason.asSemantics.IntendedMeans; +import jason.asSemantics.Intention; +import jason.asSemantics.Option; +import jason.asSemantics.Unifier; +import jason.asSyntax.ASSyntax; +import jason.asSyntax.Plan; +import jason.asSyntax.PlanBody; +import jason.asSyntax.Trigger; +import jason.util.asl2html; + +import java.awt.BorderLayout; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.util.logging.LogRecord; +import java.util.logging.StreamHandler; + +import javax.swing.JFrame; +import javax.swing.JScrollPane; +import javax.swing.JTextArea; +import javax.swing.JTextField; +import javax.swing.JTextPane; + +import org.w3c.dom.Document; + +public class ReplAg extends Agent { + + asl2html agTransformer = new asl2html("/xml/agInspection.xsl"); + JTextPane mindPanel = null; + JTextField command = null; + JTextArea output = null; + + String[] replCmds = { + clear.class.getName(), + verbose.class.getName(), + mi.class.getName()}; + + int cmdCounter = 0; + + @Override + public void initAg() { + super.initAg(); + initGui(); + initLogger(); + if (mindPanel != null) { + new Thread("update mind thread") { + public void run() { + while (getTS().getUserAgArch().isRunning()) { + try { + updateMindView(); + sleep(1000); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + }; + }.start(); + } + } + + void initLogger() { + getTS().getLogger().addHandler( new StreamHandler() { + @Override + public synchronized void publish(LogRecord l) { + output.append(l.getMessage()+"\n"); + output.setCaretPosition( output.getDocument().getLength()); + } + }); + } + + @Override + public void load(String asSrc) throws JasonException { + super.load(null); + /*try { + getPL().add(ASSyntax.parsePlan("+!run_repl_expr(Cmd__TR) <- Cmd__TR; jason.infra.repl.print_unifier.")); + } catch (ParseException e) { + e.printStackTrace(); + }*/ + } + + void execCmd() { + try { + String sCmd = command.getText().trim(); + if (sCmd.endsWith(".")) + sCmd = sCmd.substring(0,sCmd.length()-1); + for (String c: replCmds) { + if (c.endsWith(sCmd) && sCmd.startsWith(".")) { + sCmd = c; + break; + } + } + if (sCmd.startsWith(".verbose")) { + sCmd = verbose.class.getPackage().getName() + sCmd; + } + sCmd += ";"+print_unifier.class.getName(); + PlanBody lCmd = ASSyntax.parsePlanBody(sCmd); + Trigger te = ASSyntax.parseTrigger("+!run_repl_expr"); + Intention i = new Intention(); + i.push(new IntendedMeans( + new Option( + new Plan(null,te,null,lCmd), + new Unifier()), + te)); + //Literal g = ASSyntax.createLiteral("run_repl_expr", lCmd); + //getTS().getLogger().info("running "+i); + //getTS().getC().addAchvGoal(g, null); + getTS().getC().addIntention(i); + cmdCounter++; + command.setText(""); + getTS().getUserAgArch().wake(); + } catch (Exception e) { + output.setText("Error parsing "+command.getText()+"\n"+e); + } + } + + static int lastPos = 30; + + void initGui() { + command = new JTextField(40); + command.setToolTipText("Type a Jason operation here."); + command.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent arg0) { + execCmd(); + } + }); + + //mindPanel = new JTextPane(); + //mindPanel.setEditable(false); + //mindPanel.setContentType("text/html"); + + output = new JTextArea(5,50); + output.setEditable(false); + output.setText("Example of operations you can type:\n +bel; !goal; .add_plan({+!goal <- .print(ok) }); !!goal; \n .send(bob,tell,hello);\n"); + output.append(" ?bel(A); .findall(X,bel(X),L); \n"); + output.append(" .mi // to open mind inspector\n"); + output.append(" .verbose(2) // to show debug messages\n"); + output.append(" .clear // clean console\n"); + output.append("\nYou can add more agents using the button 'new REPL ag' in MAS Console."); + + output.append("\n"); + + + JFrame f = new JFrame(".:: REPL Interface for "+getTS().getUserAgArch().getAgName()+" ::."); + f.getContentPane().setLayout(new BorderLayout()); + f.getContentPane().add(BorderLayout.NORTH,command); + //f.getContentPane().add(BorderLayout.CENTER, new JScrollPane(mindPanel)); + f.getContentPane().add(BorderLayout.CENTER,new JScrollPane(output)); + + f.pack(); + int h = 200; + int w = (int)(h*2*1.618); + f.setBounds((int)(h*0.618), 20, w, h); + f.setLocation(lastPos, 200+lastPos); + lastPos += 50; + f.setVisible(true); + } + + public void clear() { + output.setText(""); + } + + private String lastMind = ""; + + void updateMindView() { + getTS().getUserAgArch().setCycleNumber(cmdCounter); + Document agState = getAgState(); // the XML representation of the agent's mind + try { + String sMind = agTransformer.transform(agState); // transform to HTML + if (!sMind.equals(lastMind)) + mindPanel.setText(sMind); // show the HTML in the screen + lastMind = sMind; + } catch (Exception e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } +} Added: trunk/src/jason/infra/repl/clear.java =================================================================== --- trunk/src/jason/infra/repl/clear.java (rev 0) +++ trunk/src/jason/infra/repl/clear.java 2014-09-13 23:50:27 UTC (rev 1801) @@ -0,0 +1,16 @@ +package jason.infra.repl; + +import jason.asSemantics.DefaultInternalAction; +import jason.asSemantics.TransitionSystem; +import jason.asSemantics.Unifier; +import jason.asSyntax.Term; + +public class clear extends DefaultInternalAction { + + @Override public Object execute(TransitionSystem ts, Unifier un, Term[] args) throws Exception { + ReplAg ag = (ReplAg)ts.getAg(); + ag.clear(); + return true; + } + +} Added: trunk/src/jason/infra/repl/mi.java =================================================================== --- trunk/src/jason/infra/repl/mi.java (rev 0) +++ trunk/src/jason/infra/repl/mi.java 2014-09-13 23:50:27 UTC (rev 1801) @@ -0,0 +1,20 @@ +package jason.infra.repl; + +import jason.architecture.MindInspectorWeb; +import jason.asSemantics.DefaultInternalAction; +import jason.asSemantics.TransitionSystem; +import jason.asSemantics.Unifier; +import jason.asSyntax.Term; + +import java.awt.Desktop; +import java.net.URI; + +public class mi extends DefaultInternalAction { + + @Override public Object execute(TransitionSystem ts, Unifier un, Term[] args) throws Exception { + String url = MindInspectorWeb.getURL()+"/agent-mind/"+ts.getUserAgArch().getAgName(); + Desktop.getDesktop().browse(new URI(url)); + return true; + } + +} Added: trunk/src/jason/infra/repl/print_unifier.java =================================================================== --- trunk/src/jason/infra/repl/print_unifier.java (rev 0) +++ trunk/src/jason/infra/repl/print_unifier.java 2014-09-13 23:50:27 UTC (rev 1801) @@ -0,0 +1,19 @@ +package jason.infra.repl; + +import jason.asSemantics.DefaultInternalAction; +import jason.asSemantics.TransitionSystem; +import jason.asSemantics.Unifier; +import jason.asSyntax.Term; +import jason.asSyntax.VarTerm; + +public class print_unifier extends DefaultInternalAction { + + @Override public Object execute(TransitionSystem ts, Unifier un, Term[] args) throws Exception { + for (VarTerm v : un) { + //if (! v.getFunctor().equals("Cmd__TR")) + ts.getLogger().info(v+"="+un.get(v)); + } + return true; + } + +} Added: trunk/src/jason/infra/repl/verbose.java =================================================================== --- trunk/src/jason/infra/repl/verbose.java (rev 0) +++ trunk/src/jason/infra/repl/verbose.java 2014-09-13 23:50:27 UTC (rev 1801) @@ -0,0 +1,27 @@ +package jason.infra.repl; + +import java.util.logging.Level; + +import jason.asSemantics.DefaultInternalAction; +import jason.asSemantics.TransitionSystem; +import jason.asSemantics.Unifier; +import jason.asSyntax.NumberTerm; +import jason.asSyntax.Term; + +public class verbose extends DefaultInternalAction { + + @Override public Object execute(TransitionSystem ts, Unifier un, Term[] args) throws Exception { + if (args.length>0 && args[0].isNumeric()) { + NumberTerm n = (NumberTerm)args[0]; + switch ((int)n.solve()) { + case 0: ts.getLogger().setLevel(Level.SEVERE); break; + case 1: ts.getLogger().setLevel(Level.INFO); break; + case 2: ts.getLogger().setLevel(Level.FINE); System.out.println("*****");break; + } + return true; + } else { + return false; + } + } + +} This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |