Source code: com/memoire/xmas/test/XmasTestFactorial.java
1
2 package com.memoire.xmas.test;
3
4 import com.memoire.xmas.*;
5 import com.memoire.xmas.basic.*;
6 import java.util.*;
7
8 public class XmasTestFactorial
9 extends XmasBasicThreadedAgent
10 {
11 private XmasBasicAddress from_;
12 private Object task_;
13
14 private transient Hashtable todo_;
15 private transient Hashtable runn_;
16 private transient Hashtable done_;
17 private transient Hashtable data_;
18 private transient Stack results_;
19 private transient XmasBasicMailbox messages_;
20
21 protected void init()
22 {
23 todo_ =new Hashtable(11);
24 runn_ =new Hashtable(11);
25 done_ =new Hashtable(11);
26 data_ =new Hashtable(11);
27 results_ =new Stack();
28 messages_=new XmasBasicMailbox();
29
30 super.init();
31 }
32
33 protected synchronized void handle
34 (XmasBasicAddress _from,
35 String _act, String _skill, Object _content, Object _ref)
36 {
37 /*
38 if("announce".equals(_act)&&"factorial".equals(_skill))
39 {
40 int price=((task_!=null) ? 1 : 0)+messages_.size();
41 sendBasicMessage(_from,"bid","factorial",""+price,_ref);
42 }
43 else
44 if("contract".equals(_act)&&"factorial".equals(_skill))
45 {
46 int price=((task_!=null) ? 1 : 0)+messages_.size();
47 sendBasicMessage(_from,"accept","factorial",""+price,_ref);
48 }
49 else
50 */
51 if("cancel".equals(_act)&&"task".equals(_skill))
52 {
53 inbox_ .cancel(_from,_ref);
54 messages_.cancel(_from,_ref);
55
56 if((task_!=null)&&(from_!=null)&&task_.equals(_ref)&&from_.equals(_from))
57 {
58 //XmasBasicAddress my=(XmasBasicAddress)XmasBasicDirectory.DEFAULT.get(this);
59 outbox_.cancel(XmasBasicAddress.ALL,_ref);
60
61 Enumeration e;
62
63 e=todo_.keys();
64 while(e.hasMoreElements())
65 {
66 Object r=e.nextElement();
67 inbox_ .cancel(XmasBasicAddress.ALL,r);
68 outbox_.cancel(XmasBasicAddress.ALL,r);
69 data_.remove(r);
70
71 sendBasicMessage(XmasBasicAddress.ALL,"cancel","task",null,r);
72 }
73 todo_.clear();
74
75 e=runn_.keys();
76 while(e.hasMoreElements())
77 {
78 Object r=e.nextElement();
79 inbox_ .cancel(XmasBasicAddress.ALL,r);
80 outbox_.cancel(XmasBasicAddress.ALL,r);
81 data_.remove(r);
82 sendBasicMessage(XmasBasicAddress.ALL,"cancel","task",null,r);
83 }
84 runn_.clear();
85
86 e=done_.keys();
87 while(e.hasMoreElements())
88 {
89 Object r=e.nextElement();
90 inbox_ .cancel(XmasBasicAddress.ALL,r);
91 outbox_.cancel(XmasBasicAddress.ALL,r);
92 data_.remove(r);
93 sendBasicMessage(XmasBasicAddress.ALL,"cancel","task",null,r);
94 }
95 done_.clear();
96
97 data_.remove(_ref);
98 results_.clear();
99 from_=null;
100 task_=null;
101 }
102 }
103 else
104 if("announce".equals(_act)&&"factorial".equals(_skill))
105 {
106 int price=3*(task_!=null ? 1 : 0)+messages_.size();
107 sendBasicMessage(_from,"bid","factorial",""+price,_ref);
108 }
109 else
110 if("contract".equals(_act)&&"factorial".equals(_skill))
111 {
112 sendBasicMessage(_from,"accept","factorial","",_ref);
113 }
114 else
115 if("request".equals(_act)&&"factorial".equals(_skill))
116 {
117 if(task_!=null)
118 {
119 System.err.println("%%% PUSH factorial "+_content);
120 messages_.push(new XmasBasicMessage
121 (_from,XmasBasicAddress.NONE,_act,_skill,_content,_ref));
122 return;
123 }
124
125 System.err.println("%%% HANDLE factorial "+_content);
126
127 int param=Integer.parseInt((String)_content);
128
129 //if(_ref==null) _ref=""+param+"!";
130 task_=_ref;
131 from_=_from;
132 todo_.clear();
133 runn_.clear();
134 done_.clear();
135 results_.clear();
136
137 for(int i=param;i>1;i-=2)
138 {
139 String ref=XmasBasicLib.generateReference();
140 System.err.println("<== "+(i-1)+"*"+i+" {"+ref+"}");
141 todo_.put(ref,Boolean.FALSE);
142 data_.put(ref,""+(i-1)+" "+i);
143 sendBasicMessage
144 (XmasBasicAddress.ALL,"announce","multiplication",""+(i-1)+" "+i,ref);
145 }
146 }
147 else if("bid".equals(_act)&&"multiplication".equals(_skill))
148 {
149 //System.err.println("--> bid multiplication "+data_.get(_ref));
150
151 if(_ref ==null) return;
152 if(task_ ==null) return;
153
154 if(runn_.get(_ref)!=null)
155 {
156 sendBasicMessage
157 (_from,"cancel","multiplication",null,_ref);
158 return;
159 }
160
161 if(todo_.get(_ref)==null) return;
162
163 todo_.remove(_ref);
164 runn_.put(_ref,Boolean.FALSE);
165
166 //System.err.println("<-- contract multiplication "+data_.get(_ref));
167 sendBasicMessage
168 (_from,"contract","multiplication",data_.get(_ref),_ref);
169 }
170 else if("accept".equals(_act)&&"multiplication".equals(_skill))
171 {
172 //System.err.println("--> accept multiplication "+data_.get(_ref));
173
174 if(_ref ==null) return;
175 if(task_ ==null) return;
176
177 if(done_.get(_ref)!=null)
178 {
179 sendBasicMessage
180 (_from,"cancel","multiplication",null,_ref);
181 return;
182 }
183
184 if(runn_.get(_ref)==null) return;
185
186 //System.err.println("<-- request multiplication "+data_.get(_ref));
187 sendBasicMessage
188 (_from,"request","multiplication",data_.get(_ref),_ref);
189 }
190 else if("answer".equals(_act)&&"multiplication".equals(_skill))
191 {
192 if(_ref ==null) return;
193 if(task_ ==null) return;
194 if(runn_.get(_ref)==null) return;
195
196 sendBasicMessage(XmasBasicAddress.ALL,"cancel","task",null,_ref);
197
198 if(done_.get(_ref)!=null) return;
199
200 Integer tmp=new Integer((String)_content);
201
202 runn_.remove(_ref);
203 done_.put(_ref,tmp);
204 results_.push(tmp);
205
206 System.err.println("TODO:"+todo_.size()+" RUNN:"+runn_.size()+
207 " DONE:"+done_.size()+" TMP="+tmp);
208
209 if(results_.size()>=2)
210 {
211 Integer a=(Integer)results_.pop();
212 Integer b=(Integer)results_.pop();
213 String ref=XmasBasicLib.generateReference();
214 System.err.println("<== "+a+"*"+b+" {"+ref+"}");
215
216 todo_.put(ref,Boolean.FALSE);
217 data_.put(ref,""+a+" "+b);
218 sendBasicMessage(XmasBasicAddress.ALL,"announce","multiplication",""+a+" "+b,ref);
219 XmasBasicLib.sleep();
220 }
221
222 if((todo_.size()==0)&&(runn_.size()==0)&&(results_.size()==1))
223 {
224 Integer r=(Integer)results_.pop();
225 System.err.println("RESULT="+r+" "+from_.toText());
226 sendBasicMessage(from_,"answer","factorial",""+r,task_);
227 todo_.clear();
228 runn_.clear();
229 done_.clear();
230 data_.clear();
231 results_.clear();
232 from_=null;
233 task_=null;
234 XmasBasicLib.sleep();
235
236 if(!messages_.isEmpty())
237 {
238 XmasBasicMessage m=(XmasBasicMessage)messages_.pop();
239 System.err.println("%%% POP factorial "+m.content());
240 handle((XmasBasicAddress)m.from(),m.act(),m.skill(),m.content(),m.reference());
241 }
242 }
243 }
244 //else System.err.println("%%% "+_act+" "+_skill);
245 }
246
247 public String toString() { return "TestFactorial"; }
248 }