|
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.
|