エージェント名 | ファイル名 | 説明 |
---|---|---|
TimeSender | TimeSender.dash | ストリームを送信するエージェント |
TimeSender.class | ベースプロセス | |
TimeReceiver | TimeReceiver.dash | ストリームを受信するエージェント |
TimeReceiver.class | ベースプロセス |
(agent TimeSender (property (create :author "yu" :modifiedBy "taka") ) (initial_facts ) (knowledge (rule startup (Msg :performative __INIT_I) (Status :name ?name) --> (inspect nonstop) (loadBP baseProcess.dashSample.TimeSender) // BP読み込み (startBP) // run()呼び出し (control startup ()) // startup()呼び出し (control setWindowTitle(?name)) // setWindowTitle()呼び出し (bind ?t (current-time)) //キーとなるファクトを作成 (make (key :name ?name :time ?t)) ) //パイプの作成とストリーム送信開始 (rule sendStream (key :name ?name :time ?t) = ?arg --> (bind ?key (toString ?arg)) //キーを用いてストリーム送受信用のパイプを作成し、 //ストリーム送信開始 (control startOutputStream(?key)) ) //キー要求を受け取り、キーを送る (rule receive-keyRequest (Msg :performative keyRequest :from ?sender ) = ?msg (key :name ?name :time ?t) = ?arg --> (bind ?key (toString ?arg)) (send :performative sendKey :to ?sender :content (?key)) (remove ?msg) ) ) ) |
●ベースプロセス (TimeSender.java)
package baseProcess.dashSample; import java.util.*; import java.awt.*; import javax.swing.*; import javax.swing.border.*; import dash.*; import java.io.*; public class TimeSender extends JFrame implements DashBP { private DashAgent agent; JTextArea textarea; String key; BufferedWriter out; OutputStream os = null; //ループ用フラグ boolean flag = true; //同期用オブジェクト Object obj = new Object(); /** コンストラクタ。アクション(loadBP)実行時に呼ばれる。 */ public TimeSender() { super("TimeSender"); } /** アクション(loadBP)実行時に呼ばれる。*/ public void setAgent(DashAgent agent) { this.agent = agent; } /** アクション(startBP)実行時に呼ばれる */ public void run() { //出力ストリーム取得まで待つ synchronized (obj) { try { obj.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } //出力ストリーム取得後の処理 out = new BufferedWriter(new OutputStreamWriter(os)); while (flag) { Date now = new Date(); textarea.setText(now.toString()); try { out.write(now.toString() + "\n"); out.flush(); } catch (IOException e) { e.printStackTrace(); } try { Thread.sleep(1500); } catch (InterruptedException e) { e.printStackTrace(); } } } /** エージェントの終了時に呼ばれる */ public void finalizeBP() { flag = false; if (out != null) { //Pipeの切断処理を実行 agent.pm.close(key); } dispose(); } /** ルールstartup内で呼び出される */ public void startup() { setup(); // ときどきnullなことがある while (textarea == null) try { Thread.sleep(500); } catch (InterruptedException e) { } textarea.append("起動\n"); } /** ルールstartup内で呼び出される */ public void setWindowTitle(Object[] str1) { setTitle("sWin:" + str1[0]); } //Pipe作成、ストリーム送信開始 public void startOutputStream(Object[] str) { key = (String) str[0]; // キーを用いてPipeの作成処理を実行 agent.pm.create(key); synchronized (obj) { // キーを用いて出力ストリームを取得 os = agent.pm.getOutputStream(key); obj.notify(); } } /** ウィンドウを作る */ private void setup() { textarea = new JTextArea(6, 20); JScrollPane sc = new JScrollPane(textarea); sc.setBorder(new TitledBorder("Output")); getContentPane().add(sc, BorderLayout.CENTER); pack(); setVisible(true); } } |
(agent TimeReceiver (property (create :author "yu" :modifiedBy "taka") ) (initial_facts ) (knowledge (rule startup (Msg :performative __INIT_I) (Status :name ?name) --> (inspect nonstop) (loadBP baseProcess.dashSample.TimeReceiver) // BP読み込み (startBP) // run()呼び出し (control startup ()) ) // ベースプロセスからのイベントを受け取り、 // TimeSenderにキーを要求する (rule event-handling (Msg :performative __Event :content (?string)) = ?msg --> (bind ?agents (lookup :rname TimeSender)) (bind ?agent (shift ?agents)) (send :performative keyRequest :to ?agent:name :content ()) (remove ?msg) ) // TimeSenderから、キーを受け取る (rule receive-sendKey (Msg :performative sendKey :from ?sender :content (?key)) = ?msg --> //キーを用いてストリーム受信を開始 (control startInputStream(?key)) (remove ?msg) ) ) ) |
●ベースプロセス (TimeReceiver.java)
package baseProcess.dashSample; import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.border.*; import dash.*; import java.io.*; public class TimeReceiver extends JFrame implements DashBP, ActionListener { private DashAgent agent; JTextArea textarea; JButton startbutton; JButton stopbutton; BufferedReader in; InputStream is = null; //ループ用フラグ boolean flag = true; //同期用オブジェクト Object obj = new Object(); /** コンストラクタ。アクション(loadBP)実行時に呼ばれる。 */ public TimeReceiver() { super("TimeReceiver"); } /** アクション(loadBP)実行時に呼ばれる。*/ public void setAgent(DashAgent agent) { this.agent = agent; } /** アクション(startBP)実行時に呼ばれる * * */ public void run() { //入力ストリーム取得まで待つ synchronized (obj) { try { obj.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } //入力ストリーム取得後の処理 in = new BufferedReader(new InputStreamReader(is)); try { while (flag) { String ss = in.readLine(); if (ss != null) textarea.append(ss + "\n"); } } catch (IOException e) { finalizeBP(); //System.out.println("Pipeの接続が切れました"); } } //ストリーム受信開始 public void startInputStream(Object[] str) { synchronized (obj) { //入力ストリームを取得 is = agent.pm.getInputStream((String) str[0]); obj.notify(); } } /** エージェントの終了時に呼ばれる */ public void finalizeBP() { flag = false; if (in != null) { try { in.close(); } catch (IOException e) { e.printStackTrace(); } } dispose(); } /** startボタンを押し、エージェントにイベントを上げる */ public void actionPerformed(ActionEvent ae) { //System.out.println(((JButton)ae.getSource()).getText()); if (agent != null) { if (((JButton) ae.getSource()).getText().equals("Start")) { agent.raiseEvent("start"); } else if (((JButton) ae.getSource()).getText().equals("Finish")) { dispose(); } } } /** ルールstartup内で呼び出される */ public void startup() { setup(); // ときどきnullなことがある while (textarea == null) try { Thread.sleep(500); } catch (InterruptedException e) { } textarea.append("起動\n"); } /** ウィンドウを作る */ private void setup() { textarea = new JTextArea(6, 20); JScrollPane sc = new JScrollPane(textarea); sc.setBorder(new TitledBorder("Input")); startbutton = new JButton("Start"); startbutton.addActionListener(this); stopbutton = new JButton("Finish"); stopbutton.addActionListener(this); JPanel panel = new JPanel(); panel.add(startbutton); panel.add(stopbutton); GridLayout layout = new GridLayout(1, 2); panel.setLayout(layout); getContentPane().add(sc, BorderLayout.CENTER); getContentPane().add(panel, BorderLayout.SOUTH); pack(); setVisible(true); } } |