1 package hero.client.test; 2 3 24 25 import hero.interfaces.BnEdgeValue; 26 import hero.interfaces.BnNodeValue; 27 import hero.interfaces.BnProjectValue; 28 import hero.interfaces.Constants; 29 import hero.interfaces.Engine; 30 import hero.interfaces.EngineHome; 31 import hero.interfaces.EngineUtil; 32 import hero.interfaces.ProjectSession; 33 import hero.interfaces.ProjectSessionHome; 34 import hero.interfaces.ProjectSessionUtil; 35 import hero.util.EngineException; 36 import hero.util.HeroException; 37 import junit.framework.TestCase; 38 import junit.framework.TestSuite; 39 40 public class EngineTests extends TestCase { 41 private ProjectSessionHome psh; 42 private ProjectSession ps; 43 private EngineHome eh; 44 private Engine eng; 45 46 public EngineTests(String testname) { 47 super(testname); 48 } 49 50 public static TestSuite suite() { 51 return new TestSuite(EngineTests.class); 52 } 53 54 public void setUp() throws Exception { 55 psh = ProjectSessionUtil.getHome(); 56 eh = EngineUtil.getHome(); 57 } 58 59 public void testEngineAND() throws Exception { 60 ProjectSession proj; 61 BnProjectValue pm; 62 BnNodeValue nd; 63 BnEdgeValue ev; 64 65 proj = psh.create(); 67 proj.initProject("work"); 68 proj.addNode("init", Constants.Nd.AND_JOIN_NODE); 69 proj.addNode("sp1", Constants.Nd.AND_JOIN_AUTOMATIC_NODE); 70 proj.addNode("ac1", Constants.Nd.AND_JOIN_NODE); 71 proj.addNode("ac2", Constants.Nd.AND_JOIN_NODE); 72 proj.addNode("jn1", Constants.Nd.AND_JOIN_AUTOMATIC_NODE); 73 proj.addNode("ac3", Constants.Nd.AND_JOIN_NODE); 74 String e1 = proj.addEdge("init", "sp1"); 75 String e2 = proj.addEdge("sp1", "ac1"); 76 String e3 = proj.addEdge("sp1", "ac2"); 77 String e4 = proj.addEdge("ac1", "jn1"); 78 String e5 = proj.addEdge("ac2", "jn1"); 79 String e6 = proj.addEdge("jn1", "ac3"); 80 proj.addRole("test", "testeur"); 81 proj.setUserRole("admin", "test"); 82 83 eng = eh.create(); 84 85 try { 86 eng.startActivity("work","ac1"); 87 assertTrue("start ac1 should have failed", false); 88 } catch (EngineException e) { 89 } 91 92 try { 93 eng.terminateActivity("work","init"); 94 assertTrue("terminate init should have failed", false); 95 } catch (EngineException e) { 96 } 98 99 eng.startActivity("work","init"); 100 proj = psh.create(); 101 proj.initProject("work"); 102 103 assertTrue("BnNode State Error init",proj.getNodeValue("init").getState() == Constants.Nd.EXECUTING); 104 assertTrue("BnEdge State Error e1",proj.getEdgeValue(e1).getState() == Constants.Ed.ANTICIPATING); 105 assertTrue("BnNode State Error sp1",proj.getNodeValue("sp1").getState() == Constants.Nd.ANTICIPATING); 106 assertTrue("BnEdge State Error e2",proj.getEdgeValue(e2).getState() == Constants.Ed.ANTICIPATING); 107 assertTrue("BnNode State Error ac1",proj.getNodeValue("ac1").getState() == Constants.Nd.ANTICIPABLE); 108 assertTrue("BnEdge State Error e3",proj.getEdgeValue(e3).getState() == Constants.Ed.ANTICIPATING); 109 assertTrue("BnNode State Error ac2",proj.getNodeValue("ac2").getState() == Constants.Nd.ANTICIPABLE); 110 assertTrue("BnEdge State Error e4",proj.getEdgeValue(e4).getState() == Constants.Ed.INITIAL); 111 assertTrue("BnEdge State Error e5", proj.getEdgeValue(e5).getState() == Constants.Ed.INITIAL); 112 assertTrue("BnNode State Error jn1",proj.getNodeValue("jn1").getState() == Constants.Nd.INITIAL); 113 assertTrue( "BnEdge State Error e6",proj.getEdgeValue(e6).getState() == Constants.Ed.INITIAL); 114 assertTrue("BnNode State Error ac3",proj.getNodeValue("ac3").getState() == Constants.Nd.INITIAL); 115 116 try { 117 eng.terminateActivity("work","sp1"); 118 assertTrue("terminate sp1 should have failed", false); 119 } catch (EngineException e) { 120 } 122 123 eng.terminateActivity("work","init"); 124 125 assertTrue("BnNode State Error Term init",proj.getNodeValue("init").getState() == Constants.Nd.TERMINATED); 126 assertTrue("BnEdge State Error Term e1", proj.getEdgeValue(e1).getState() == Constants.Ed.ACTIVE); 127 assertTrue("BnNode State Error Term sp1",proj.getNodeValue("sp1").getState() == Constants.Nd.TERMINATED); 128 assertTrue("BnEdge State Error e2",proj.getEdgeValue(e2).getState() == Constants.Ed.ACTIVE); 129 assertTrue("BnNode State Error ac1",proj.getNodeValue("ac1").getState() == Constants.Nd.READY); 130 assertTrue("BnEdge State Error e3",proj.getEdgeValue(e3).getState() == Constants.Ed.ACTIVE); 131 assertTrue("BnNode State Error ac2",proj.getNodeValue("ac2").getState() == Constants.Nd.READY); 132 assertTrue("BnEdge State Error e4",proj.getEdgeValue(e4).getState() == Constants.Ed.INITIAL); 133 assertTrue("BnEdge State Error e5",proj.getEdgeValue(e5).getState() == Constants.Ed.INITIAL); 134 assertTrue("BnNode State Error jn1",proj.getNodeValue("jn1").getState() == Constants.Nd.INITIAL); 135 assertTrue("BnEdge State Error e6",proj.getEdgeValue(e6).getState() == Constants.Ed.INITIAL); 136 assertTrue("BnNode State Error ac3",proj.getNodeValue("ac3").getState() == Constants.Nd.INITIAL); 137 138 eng.startActivity("work","ac1"); 139 140 assertTrue("BnNode State Error start ac1 : init",proj.getNodeValue("init").getState() == Constants.Nd.TERMINATED); 141 assertTrue("BnEdge State Error start ac1 : e1",proj.getEdgeValue(e1).getState() == Constants.Ed.ACTIVE); 142 assertTrue("BnNode State Error start ac1 : sp1",proj.getNodeValue("sp1").getState() == Constants.Nd.TERMINATED); 143 assertTrue("BnEdge State Error start ac1 : e2",proj.getEdgeValue(e2).getState() == Constants.Ed.ACTIVE); 144 assertTrue("BnNode State Error start ac1 : ac1",proj.getNodeValue("ac1").getState() == Constants.Nd.EXECUTING); 145 assertTrue("BnEdge State Error start ac1 : e3",proj.getEdgeValue(e3).getState() == Constants.Ed.ACTIVE); 146 assertTrue("BnNode State Error start ac1 : ac2",proj.getNodeValue("ac2").getState() == Constants.Nd.READY); 147 assertTrue("BnEdge State Error start ac1 : e4",proj.getEdgeValue(e4).getState() == Constants.Ed.ANTICIPATING); 148 assertTrue("BnEdge State Error start ac1 : e5",proj.getEdgeValue(e5).getState() == Constants.Ed.INITIAL); 149 assertTrue("BnNode State Error start ac1 : jn1",proj.getNodeValue("jn1").getState() == Constants.Nd.INITIAL); 150 assertTrue("BnEdge State Error start ac1 : e6",proj.getEdgeValue(e6).getState() == Constants.Ed.INITIAL); 151 assertTrue("BnNode State Error start ac1 : ac3",proj.getNodeValue("ac3").getState() == Constants.Nd.INITIAL); 152 153 eng.startActivity("work","ac2"); 154 155 assertTrue("BnNode State Error start ac2 : init",proj.getNodeValue("init").getState()== Constants.Nd.TERMINATED); 156 assertTrue("BnEdge State Error start ac2 : e1",proj.getEdgeValue(e1).getState() == Constants.Ed.ACTIVE); 157 assertTrue("BnNode State Error start ac2 : sp1",proj.getNodeValue("sp1").getState()== Constants.Nd.TERMINATED); 158 assertTrue("BnEdge State Error start ac2 : e2", proj.getEdgeValue(e2).getState()== Constants.Ed.ACTIVE); 159 assertTrue("BnNode State Error start ac2 : ac1",proj.getNodeValue("ac1").getState() == Constants.Nd.EXECUTING); 160 assertTrue("BnEdge State Error start ac2 : e3",proj.getEdgeValue(e3).getState() == Constants.Ed.ACTIVE); 161 assertTrue("BnNode State Error start ac2 : ac2",proj.getNodeValue("ac2").getState() == Constants.Nd.EXECUTING); 162 assertTrue("BnEdge State Error start ac2 : e4",proj.getEdgeValue(e4).getState() == Constants.Ed.ANTICIPATING); 163 assertTrue("BnEdge State Error start ac2 : e5",proj.getEdgeValue(e5).getState() == Constants.Ed.ANTICIPATING); 164 assertTrue("BnNode State Error start ac2 : jn1",proj.getNodeValue("jn1").getState() == Constants.Nd.ANTICIPATING); 165 assertTrue("BnEdge State Error start ac2 : e6", proj.getEdgeValue(e6).getState() == Constants.Ed.ANTICIPATING); 166 assertTrue("BnNode State Error start ac2 : ac3",proj.getNodeValue("ac3").getState() == Constants.Nd.ANTICIPABLE); 167 168 eng.startActivity("work","ac3"); 169 170 try { 171 eng.terminate("work"); 172 assertTrue("should have failed", false); 173 } catch (HeroException h) { 174 } 176 177 assertTrue("BnNode State Error start ac3 : init",proj.getNodeValue("init").getState() == Constants.Nd.TERMINATED); 178 assertTrue("BnEdge State Error start ac3 : e1",proj.getEdgeValue(e1).getState() == Constants.Ed.ACTIVE); 179 assertTrue("BnNode State Error start ac3 : sp1",proj.getNodeValue("sp1").getState() == Constants.Nd.TERMINATED); 180 assertTrue("BnEdge State Error start ac3 : e2",proj.getEdgeValue(e2).getState() == Constants.Ed.ACTIVE); 181 assertTrue("BnNode Value Error start ac3 : ac1",proj.getNodeValue("ac1").getState() == Constants.Nd.EXECUTING); 182 assertTrue("BnEdge Value Error start ac3 : e3", proj.getEdgeValue(e3).getState() == Constants.Ed.ACTIVE); 183 assertTrue("BnNode Value Error start ac3 : ac2",proj.getNodeValue("ac2").getState() == Constants.Nd.EXECUTING); 184 assertTrue("BnEdge Value Error start ac3 : e4", proj.getEdgeValue(e4).getState() == Constants.Ed.ANTICIPATING); 185 assertTrue("BnEdge Value Error start ac3 : e5", proj.getEdgeValue(e5).getState() == Constants.Ed.ANTICIPATING); 186 assertTrue("BnNode Value Error start ac3 : jn1",proj.getNodeValue("jn1").getState() == Constants.Nd.ANTICIPATING); 187 assertTrue("BnEdge Value Error start ac3 : e6", proj.getEdgeValue(e6).getState() == Constants.Ed.ANTICIPATING); 188 assertTrue("BnNode Value Error start ac3 : ac3",proj.getNodeValue("ac3").getState() == Constants.Nd.ANTICIPATING); 189 190 try { 191 eng.terminateActivity("work","ac3"); 192 assertTrue("terminate ac3 should have failed", false); 193 } catch (EngineException e) { 194 } 196 197 eng.terminateActivity("work","ac1"); 198 199 assertTrue("BnNode Value Error terminate ac1 : init",proj.getNodeValue("init").getState() == Constants.Nd.TERMINATED); 200 assertTrue("BnEdge Value Error terminate ac1 : e1", proj.getEdgeValue(e1).getState() == Constants.Ed.ACTIVE); 201 assertTrue("BnNode Value Error terminate ac1 : sp1",proj.getNodeValue("sp1").getState() == Constants.Nd.TERMINATED); 202 assertTrue("BnEdge Value Error terminate ac1 : e2", proj.getEdgeValue(e2).getState() == Constants.Ed.ACTIVE); 203 assertTrue("BnNode Value Error terminate ac1 : ac1",proj.getNodeValue("ac1").getState() == Constants.Nd.TERMINATED); 204 assertTrue("BnEdge Value Error terminate ac1 : e3", proj.getEdgeValue(e3).getState() == Constants.Ed.ACTIVE); 205 assertTrue("BnNode Value Error terminate ac1 : ac2",proj.getNodeValue("ac2").getState() == Constants.Nd.EXECUTING); 206 assertTrue("BnEdge Value Error terminate ac1 : e4", proj.getEdgeValue(e4).getState() == Constants.Ed.ACTIVE); 207 assertTrue("BnEdge Value Error terminate ac1 : e5", proj.getEdgeValue(e5).getState() == Constants.Ed.ANTICIPATING); 208 assertTrue("BnNode Value Error terminate ac1 : jn1",proj.getNodeValue("jn1").getState() == Constants.Nd.ANTICIPATING); 209 assertTrue("BnEdge Value Error terminate ac1 : e6", proj.getEdgeValue(e6).getState() == Constants.Ed.ANTICIPATING); 210 assertTrue("BnNode Value Error terminate ac1 : ac3",proj.getNodeValue("ac3").getState() == Constants.Nd.ANTICIPATING); 211 212 eng.terminateActivity("work","ac2"); 213 214 assertTrue("BnNode Value Error terminate ac2 : init",proj.getNodeValue("init").getState() == Constants.Nd.TERMINATED); 215 assertTrue("BnEdge Value Error terminate ac2 : e1", proj.getEdgeValue(e1).getState() == Constants.Ed.ACTIVE); 216 assertTrue("BnNode Value Error terminate ac2 : sp1",proj.getNodeValue("sp1").getState() == Constants.Nd.TERMINATED); 217 assertTrue("BnEdge Value Error terminate ac2 : e2", proj.getEdgeValue(e2).getState() == Constants.Ed.ACTIVE); 218 assertTrue("BnNode Value Error terminate ac2 : ac1",proj.getNodeValue("ac1").getState() == Constants.Nd.TERMINATED); 219 assertTrue("BnEdge Value Error terminate ac2 : e3", proj.getEdgeValue(e3).getState() == Constants.Ed.ACTIVE); 220 assertTrue("BnNode Value Error terminate ac2 : ac2",proj.getNodeValue("ac2").getState() == Constants.Nd.TERMINATED); 221 assertTrue("BnEdge Value Error terminate ac2 : e4",proj.getEdgeValue(e4).getState() == Constants.Ed.ACTIVE); 222 assertTrue("BnEdge Value Error terminate ac2 : e5", proj.getEdgeValue(e5).getState() == Constants.Ed.ACTIVE); 223 assertTrue("BnNode Value Error terminate ac2 : jn1",proj.getNodeValue("jn1").getState() == Constants.Nd.TERMINATED); 224 assertTrue("BnEdge Value Error terminate ac2 : e6", proj.getEdgeValue(e6).getState() == Constants.Ed.ACTIVE); 225 assertTrue("BnNode Value Error terminate ac2 : ac3",proj.getNodeValue("ac3").getState() == Constants.Nd.EXECUTING); 226 227 eng.terminateActivity("work","ac3"); 228 229 assertTrue("BnNode Value Error terminate ac2 : init",proj.getNodeValue("init").getState() == Constants.Nd.TERMINATED); 230 assertTrue("BnEdge Value Error terminate ac2 : e1",proj.getEdgeValue(e1).getState() == Constants.Ed.ACTIVE); 231 assertTrue("BnNode Value Error terminate ac2 : sp1", proj.getNodeValue("sp1").getState() == Constants.Nd.TERMINATED); 232 assertTrue("BnEdge Value Error terminate ac2 : e2",proj.getEdgeValue(e2).getState() == Constants.Ed.ACTIVE); 233 assertTrue("BnNode Value Error terminate ac2 : ac1",proj.getNodeValue("ac1").getState() == Constants.Nd.TERMINATED); 234 assertTrue("BnEdge Value Error terminate ac2 : e3",proj.getEdgeValue(e3).getState() == Constants.Ed.ACTIVE); 235 assertTrue("BnNode Value Error terminate ac2 : ac2",proj.getNodeValue("ac2").getState() == Constants.Nd.TERMINATED); 236 assertTrue("BnEdge Value Error terminate ac2 : e4", proj.getEdgeValue(e4).getState() == Constants.Ed.ACTIVE); 237 assertTrue("BnEdge Value Error terminate ac2 : e5", proj.getEdgeValue(e5).getState() == Constants.Ed.ACTIVE); 238 assertTrue("BnNode Value Error terminate ac2 : jn1",proj.getNodeValue("jn1").getState() == Constants.Nd.TERMINATED); 239 assertTrue("BnEdge Value Error terminate ac2 : e6", proj.getEdgeValue(e6).getState() == Constants.Ed.ACTIVE); 240 assertTrue("BnNode Value Error terminate ac2 : ac3",proj.getNodeValue("ac3").getState() == Constants.Nd.TERMINATED); 241 242 try { 243 eng.startActivity("work","ac2"); 244 assertTrue("start ac2 should have failed", false); 245 } catch (EngineException e) { 246 } 248 249 eng.terminate("work"); 250 assertTrue("Wrong project state",proj.getDetails().getState() == Constants.Pj.TERMINATED); 251 } 252 253 254 public void testEngineOR() throws Exception { 255 ProjectSession proj; 256 BnProjectValue pm; 257 BnNodeValue nd; 258 BnEdgeValue ev; 259 260 proj = psh.create(); 262 proj.initProject("workOR"); 263 proj.addNode("init", Constants.Nd.AND_JOIN_NODE); 264 proj.addNode("sp1", Constants.Nd.AND_JOIN_NODE); 265 proj.addNode("ac1", Constants.Nd.AND_JOIN_NODE); 266 proj.addNode("ac2", Constants.Nd.AND_JOIN_NODE); 267 proj.addNode("jn1", Constants.Nd.OR_JOIN_NODE); 268 proj.addNode("ac3", Constants.Nd.AND_JOIN_NODE); 269 String e1 = proj.addEdge("init", "sp1"); 270 String e2 = proj.addEdge("sp1", "ac1"); 271 String e3 = proj.addEdge("sp1", "ac2"); 272 String e4 = proj.addEdge("ac1", "jn1"); 273 String e5 = proj.addEdge("ac2", "jn1"); 274 String e6 = proj.addEdge("jn1", "ac3"); 275 proj.addRole("test", "testeur"); 276 proj.setUserRole("admin", "test"); 277 278 eng = eh.create(); 279 eng.startActivity("workOR","init"); 280 eng.startActivity("workOR","sp1"); 281 proj = psh.create(); 282 proj.initProject("workOR"); 283 eng.terminateActivity("workOR","init"); 284 285 assertTrue("BnNode State Error init", proj.getNodeValue("init").getState() == Constants.Nd.TERMINATED); 286 assertTrue("BnEdge State Error e1",proj.getEdgeValue(e1).getState() == Constants.Ed.ACTIVE); 287 assertTrue("BnNode State Error sp1",proj.getNodeValue("sp1").getState() == Constants.Nd.EXECUTING); 288 assertTrue("BnEdge State Error e2",proj.getEdgeValue(e2).getState() == Constants.Ed.ANTICIPATING); 289 assertTrue("BnNode State Error ac1",proj.getNodeValue("ac1").getState() == Constants.Nd.ANTICIPABLE); 290 assertTrue("BnEdge State Error e3",proj.getEdgeValue(e3).getState() == Constants.Ed.ANTICIPATING); 291 assertTrue("BnNode State Error ac2",proj.getNodeValue("ac2").getState() == Constants.Nd.ANTICIPABLE); 292 assertTrue("BnEdge State Error e4",proj.getEdgeValue(e4).getState() == Constants.Ed.INITIAL); 293 assertTrue("BnEdge State Error e5", proj.getEdgeValue(e5).getState() == Constants.Ed.INITIAL); 294 assertTrue("BnNode State Error jn1", proj.getNodeValue("jn1").getState() == Constants.Nd.INITIAL); 295 assertTrue( "BnEdge State Error e6", proj.getEdgeValue(e6).getState() == Constants.Ed.INITIAL); 296 assertTrue("BnNode State Error ac3",proj.getNodeValue("ac3").getState() == Constants.Nd.INITIAL); 297 298 eng.startActivity("workOR","ac1"); 299 300 assertTrue("BnNode State Error start ac1 : init",proj.getNodeValue("init").getState() == Constants.Nd.TERMINATED); 301 assertTrue("BnEdge State Error start ac1 : e1",proj.getEdgeValue(e1).getState() == Constants.Ed.ACTIVE); 302 assertTrue("BnNode State Error start ac1 : sp1",proj.getNodeValue("sp1").getState() == Constants.Nd.EXECUTING); 303 assertTrue("BnEdge State Error start ac1 : e2",proj.getEdgeValue(e2).getState() == Constants.Ed.ANTICIPATING); 304 assertTrue("BnNode State Error start ac1 : ac1",proj.getNodeValue("ac1").getState() == Constants.Nd.ANTICIPATING); 305 assertTrue("BnEdge State Error start ac1 : e3",proj.getEdgeValue(e3).getState() == Constants.Ed.ANTICIPATING); 306 assertTrue("BnNode State Error start ac1 : ac2",proj.getNodeValue("ac2").getState() == Constants.Nd.ANTICIPABLE); 307 assertTrue("BnEdge State Error start ac1 : e4",proj.getEdgeValue(e4).getState() == Constants.Ed.ANTICIPATING); 308 assertTrue("BnEdge State Error start ac1 : e5",proj.getEdgeValue(e5).getState() == Constants.Ed.INITIAL); 309 assertTrue("BnNode State Error start ac1 : jn1",proj.getNodeValue("jn1").getState() == Constants.Nd.ANTICIPABLE); 310 assertTrue("BnEdge State Error start ac1 : e6",proj.getEdgeValue(e6).getState() == Constants.Ed.INITIAL); 311 assertTrue("BnNode State Error start ac1 : ac3",proj.getNodeValue("ac3").getState() == Constants.Nd.INITIAL); 312 313 eng.startActivity("workOR","ac2"); 314 315 assertTrue("BnNode State Error start ac1 : init",proj.getNodeValue("init").getState() == Constants.Nd.TERMINATED); 316 assertTrue("BnEdge State Error start ac1 : e1",proj.getEdgeValue(e1).getState() == Constants.Ed.ACTIVE); 317 assertTrue("BnNode State Error start ac1 : sp1",proj.getNodeValue("sp1").getState() == Constants.Nd.EXECUTING); 318 assertTrue("BnEdge State Error start ac1 : e2",proj.getEdgeValue(e2).getState() == Constants.Ed.ANTICIPATING); 319 assertTrue("BnNode State Error start ac1 : ac1",proj.getNodeValue("ac1").getState() == Constants.Nd.ANTICIPATING); 320 assertTrue("BnEdge State Error start ac1 : e3",proj.getEdgeValue(e3).getState() == Constants.Ed.ANTICIPATING); 321 assertTrue("BnNode State Error start ac1 : ac2",proj.getNodeValue("ac2").getState() == Constants.Nd.ANTICIPATING); 322 assertTrue("BnEdge State Error start ac1 : e4",proj.getEdgeValue(e4).getState() == Constants.Ed.ANTICIPATING); 323 assertTrue("BnEdge State Error start ac1 : e5",proj.getEdgeValue(e5).getState() == Constants.Ed.ANTICIPATING); 324 assertTrue("BnNode State Error start ac1 : jn1",proj.getNodeValue("jn1").getState() == Constants.Nd.ANTICIPABLE); 325 assertTrue("BnEdge State Error start ac1 : e6",proj.getEdgeValue(e6).getState() == Constants.Ed.INITIAL); 326 assertTrue("BnNode State Error start ac1 : ac3",proj.getNodeValue("ac3").getState() == Constants.Nd.INITIAL); 327 328 eng.terminateActivity("workOR","sp1"); 329 330 assertTrue("BnNode State Error start ac1 : init",proj.getNodeValue("init").getState() == Constants.Nd.TERMINATED); 331 assertTrue("BnEdge State Error start ac1 : e1",proj.getEdgeValue(e1).getState() == Constants.Ed.ACTIVE); 332 assertTrue("BnNode State Error start ac1 : sp1",proj.getNodeValue("sp1").getState() == Constants.Nd.TERMINATED); 333 assertTrue("BnEdge State Error start ac1 : e2",proj.getEdgeValue(e2).getState() == Constants.Ed.ACTIVE); 334 assertTrue("BnNode State Error start ac1 : ac1",proj.getNodeValue("ac1").getState() == Constants.Nd.EXECUTING); 335 assertTrue("BnEdge State Error start ac1 : e3",proj.getEdgeValue(e3).getState() == Constants.Ed.ACTIVE); 336 assertTrue("BnNode State Error start ac1 : ac2",proj.getNodeValue("ac2").getState() == Constants.Nd.EXECUTING); 337 assertTrue("BnEdge State Error start ac1 : e4",proj.getEdgeValue(e4).getState() == Constants.Ed.ANTICIPATING); 338 assertTrue("BnEdge State Error start ac1 : e5",proj.getEdgeValue(e5).getState() == Constants.Ed.ANTICIPATING); 339 assertTrue("BnNode State Error start ac1 : jn1",proj.getNodeValue("jn1").getState() == Constants.Nd.ANTICIPABLE); 340 assertTrue("BnEdge State Error start ac1 : e6",proj.getEdgeValue(e6).getState() == Constants.Ed.INITIAL); 341 assertTrue("BnNode State Error start ac1 : ac3",proj.getNodeValue("ac3").getState() == Constants.Nd.INITIAL); 342 343 eng.terminateActivity("workOR","ac1"); 344 345 assertTrue("BnNode State Error start ac1 : init",proj.getNodeValue("init").getState() == Constants.Nd.TERMINATED); 346 assertTrue("BnEdge State Error start ac1 : e1",proj.getEdgeValue(e1).getState() == Constants.Ed.ACTIVE); 347 assertTrue("BnNode State Error start ac1 : sp1",proj.getNodeValue("sp1").getState() == Constants.Nd.TERMINATED); 348 assertTrue("BnEdge State Error start ac1 : e2",proj.getEdgeValue(e2).getState() == Constants.Ed.ACTIVE); 349 assertTrue("BnNode State Error start ac1 : ac1",proj.getNodeValue("ac1").getState() == Constants.Nd.TERMINATED); 350 assertTrue("BnEdge State Error start ac1 : e3",proj.getEdgeValue(e3).getState() == Constants.Ed.ACTIVE); 351 assertTrue("BnNode State Error start ac1 : ac2",proj.getNodeValue("ac2").getState() == Constants.Nd.EXECUTING); 352 assertTrue("BnEdge State Error start ac1 : e4",proj.getEdgeValue(e4).getState() == Constants.Ed.ACTIVE); 353 assertTrue("BnEdge State Error start ac1 : e5",proj.getEdgeValue(e5).getState() == Constants.Ed.ANTICIPATING); 354 assertTrue("BnNode State Error start ac1 : jn1",proj.getNodeValue("jn1").getState() == Constants.Nd.READY); 355 assertTrue("BnEdge State Error start ac1 : e6",proj.getEdgeValue(e6).getState() == Constants.Ed.INITIAL); 356 assertTrue("BnNode State Error start ac1 : ac3",proj.getNodeValue("ac3").getState() == Constants.Nd.INITIAL); 357 358 eng.terminateActivity("workOR","ac2"); 359 360 assertTrue("BnNode State Error start ac1 : init",proj.getNodeValue("init").getState() == Constants.Nd.TERMINATED); 361 assertTrue("BnEdge State Error start ac1 : e1",proj.getEdgeValue(e1).getState() == Constants.Ed.ACTIVE); 362 assertTrue("BnNode State Error start ac1 : sp1",proj.getNodeValue("sp1").getState() == Constants.Nd.TERMINATED); 363 assertTrue("BnEdge State Error start ac1 : e2",proj.getEdgeValue(e2).getState() == Constants.Ed.ACTIVE); 364 assertTrue("BnNode State Error start ac1 : ac1",proj.getNodeValue("ac1").getState() == Constants.Nd.TERMINATED); 365 assertTrue("BnEdge State Error start ac1 : e3",proj.getEdgeValue(e3).getState() == Constants.Ed.ACTIVE); 366 assertTrue("BnNode State Error start ac1 : ac2",proj.getNodeValue("ac2").getState() == Constants.Nd.TERMINATED); 367 assertTrue("BnEdge State Error start ac1 : e4",proj.getEdgeValue(e4).getState() == Constants.Ed.ACTIVE); 368 assertTrue("BnEdge State Error start ac1 : e5",proj.getEdgeValue(e5).getState() == Constants.Ed.ACTIVE); 369 assertTrue("BnNode State Error start ac1 : jn1",proj.getNodeValue("jn1").getState() == Constants.Nd.READY); 370 assertTrue("BnEdge State Error start ac1 : e6",proj.getEdgeValue(e6).getState() == Constants.Ed.INITIAL); 371 assertTrue("BnNode State Error start ac1 : ac3",proj.getNodeValue("ac3").getState() == Constants.Nd.INITIAL); 372 373 eng.startActivity("workOR","jn1"); 374 eng.startActivity("workOR","ac3"); 375 376 assertTrue("BnNode State Error start ac1 : init",proj.getNodeValue("init").getState() == Constants.Nd.TERMINATED); 377 assertTrue("BnEdge State Error start ac1 : e1",proj.getEdgeValue(e1).getState() == Constants.Ed.ACTIVE); 378 assertTrue("BnNode State Error start ac1 : sp1",proj.getNodeValue("sp1").getState() == Constants.Nd.TERMINATED); 379 assertTrue("BnEdge State Error start ac1 : e2",proj.getEdgeValue(e2).getState() == Constants.Ed.ACTIVE); 380 assertTrue("BnNode State Error start ac1 : ac1",proj.getNodeValue("ac1").getState() == Constants.Nd.TERMINATED); 381 assertTrue("BnEdge State Error start ac1 : e3",proj.getEdgeValue(e3).getState() == Constants.Ed.ACTIVE); 382 assertTrue("BnNode State Error start ac1 : ac2",proj.getNodeValue("ac2").getState() == Constants.Nd.TERMINATED); 383 assertTrue("BnEdge State Error start ac1 : e4",proj.getEdgeValue(e4).getState() == Constants.Ed.ACTIVE); 384 assertTrue("BnEdge State Error start ac1 : e5",proj.getEdgeValue(e5).getState() == Constants.Ed.ACTIVE); 385 assertTrue("BnNode State Error start ac1 : jn1",proj.getNodeValue("jn1").getState() == Constants.Nd.EXECUTING); 386 assertTrue("BnEdge State Error start ac1 : e6",proj.getEdgeValue(e6).getState() == Constants.Ed.ANTICIPATING); 387 assertTrue("BnNode State Error start ac1 : ac3",proj.getNodeValue("ac3").getState() == Constants.Nd.ANTICIPATING); 388 389 try { 390 eng.terminateActivity("workOR","ac3"); 391 assertTrue("should have failed", false); 392 } catch (HeroException h) { 393 } 395 396 eng.terminateActivity("workOR","jn1"); 397 eng.terminateActivity("workOR","ac3"); 398 399 eng.terminate("workOR"); 400 assertTrue("Wrong project state", proj.getDetails().getState() == Constants.Pj.TERMINATED); 401 } 402 403 public void testCancelANDActivity() throws Exception { 404 ProjectSession proj; 405 BnProjectValue pm; 406 BnNodeValue nd; 407 BnEdgeValue ev; 408 409 proj = psh.create(); 411 proj.initProject("workCancel"); 412 proj.addNode("init", Constants.Nd.AND_JOIN_NODE); 413 proj.addNode("sp1", Constants.Nd.AND_JOIN_NODE); 414 proj.addNode("ac1", Constants.Nd.AND_JOIN_NODE); 415 proj.addNode("ac2", Constants.Nd.AND_JOIN_NODE); 416 417 String e1 = proj.addEdge("init", "sp1"); 418 String e2 = proj.addEdge("sp1", "ac1"); 419 String e3 = proj.addEdge("sp1", "ac2"); 420 421 proj.addRole("test", "testeur"); 422 proj.setUserRole("admin", "test"); 423 424 eng = eh.create(); 425 eng.startActivity("workCancel","init"); 426 eng.startActivity("workCancel","sp1"); 427 proj = psh.create(); 428 proj.initProject("workCancel"); 429 eng.terminateActivity("workCancel","init"); 430 eng.cancelActivity("workCancel","sp1"); 431 432 assertTrue("BnNode State Error init",proj.getNodeValue("init").getState() == Constants.Nd.TERMINATED); 433 assertTrue("BnEdge State Error e1",proj.getEdgeValue(e1).getState() == Constants.Ed.ACTIVE); 434 assertTrue("BnNode State Error sp1",proj.getNodeValue("sp1").getState() == Constants.Nd.DEAD); 435 assertTrue("BnEdge State Error e2",proj.getEdgeValue(e2).getState() == Constants.Ed.DEAD); 436 assertTrue("BnNode State Error ac1",proj.getNodeValue("ac1").getState() == Constants.Nd.DEAD); 437 assertTrue("BnEdge State Error e3",proj.getEdgeValue(e3).getState() == Constants.Ed.DEAD); 438 assertTrue("BnNode State Error ac2",proj.getNodeValue("ac2").getState() == Constants.Nd.DEAD); 439 440 eng.terminate("workCancel"); 441 assertTrue("Wrong project state", proj.getDetails().getState() == Constants.Pj.TERMINATED); 442 } 443 444 public void testCancelORActivity() throws Exception { 445 ProjectSession proj; 446 BnProjectValue pm; 447 BnNodeValue nd; 448 BnEdgeValue ev; 449 450 proj = psh.create(); 452 proj.initProject("workCancelOR"); 453 proj.addNode("init", Constants.Nd.AND_JOIN_NODE); 454 proj.addNode("sp1", Constants.Nd.AND_JOIN_NODE); 455 proj.addNode("ac1", Constants.Nd.AND_JOIN_NODE); 456 proj.addNode("ac2", Constants.Nd.AND_JOIN_NODE); 457 proj.addNode("ac3", Constants.Nd.OR_JOIN_NODE); 458 459 String e1 = proj.addEdge("init", "sp1"); 460 String e2 = proj.addEdge("sp1", "ac1"); 461 String e3 = proj.addEdge("sp1", "ac2"); 462 String e4 = proj.addEdge("ac1", "ac3"); 463 String e5 = proj.addEdge("ac2", "ac3"); 464 465 proj.addRole("test", "testeur"); 466 proj.setUserRole("admin", "test"); 467 468 eng = eh.create(); 469 eng.startActivity("workCancelOR","init"); 470 eng.startActivity("workCancelOR","sp1"); 471 eng.terminateActivity("workCancelOR","init"); 472 eng.terminateActivity("workCancelOR","sp1"); 473 eng.startActivity("workCancelOR","ac2"); 474 eng.cancelActivity("workCancelOR","ac1"); 475 476 assertTrue("BnNode State Error init",proj.getNodeValue("init").getState() == Constants.Nd.TERMINATED); 477 assertTrue("BnEdge State Error e1",proj.getEdgeValue(e1).getState() == Constants.Ed.ACTIVE); 478 assertTrue("BnNode State Error sp1",proj.getNodeValue("sp1").getState() == Constants.Nd.TERMINATED); 479 assertTrue("BnEdge State Error e2",proj.getEdgeValue(e2).getState() == Constants.Ed.ACTIVE); 480 assertTrue("BnNode State Error ac1",proj.getNodeValue("ac1").getState() == Constants.Nd.DEAD); 481 assertTrue("BnEdge State Error e3",proj.getEdgeValue(e3).getState() == Constants.Ed.ACTIVE); 482 assertTrue("BnNode State Error ac2",proj.getNodeValue("ac2").getState() == Constants.Nd.EXECUTING); 483 assertTrue("BnEdge State Error e4",proj.getEdgeValue(e4).getState() == Constants.Ed.DEAD); 484 assertTrue("BnEdge State Error e5",proj.getEdgeValue(e5).getState() == Constants.Ed.ANTICIPATING); 485 assertTrue("BnNode State Error ac3",proj.getNodeValue("ac3").getState() == Constants.Nd.ANTICIPABLE); 486 } 487 488 public void testAutomaticNode() throws Exception { 489 ProjectSession proj = psh.create(); 490 proj.initProject("testoto"); 491 proj.addNode("nonode", Constants.Nd.AND_JOIN_NODE); 492 proj.addNode("supernonode", Constants.Nd.AND_JOIN_AUTOMATIC_NODE); 493 proj.addEdge("nonode", "supernonode"); 494 Engine eng = eh.create(); 495 eng.startActivity("testoto","nonode"); 496 assertTrue("Supernonode will be terminated", proj.getNodeValue("supernonode").getState()== Constants.Nd.ANTICIPATING); 497 eng.terminateActivity("testoto","nonode"); 498 assertTrue("Supernonode will be terminated", proj.getNodeValue("supernonode").getState()== Constants.Nd.TERMINATED); 499 } 500 501 public void testAutomaticNodeOR() throws Exception { 502 ProjectSession proj = psh.create(); 503 proj.initProject("testoto2"); 504 proj.addNode("nonode", Constants.Nd.AND_JOIN_NODE); 505 proj.addNode("nonode2", Constants.Nd.AND_JOIN_NODE); 506 proj.addNode("supernonode", Constants.Nd.OR_JOIN_AUTOMATIC_NODE); 507 proj.addEdge("nonode", "supernonode"); 508 proj.addEdge("nonode2", "supernonode"); 509 Engine eng = eh.create(); 510 eng.startActivity("testoto2","nonode"); 511 assertTrue("Supernonode will be anticipating ", proj.getNodeValue("supernonode").getState()== Constants.Nd.ANTICIPATING); 512 eng.startActivity("testoto2","nonode2"); 513 eng.terminateActivity("testoto2","nonode"); 514 assertTrue("Supernonode will be anticipating", proj.getNodeValue("supernonode").getState() == Constants.Nd.TERMINATED); 515 } 516 517 public void testTraditionalActivityNode() throws Exception { 518 ProjectSession proj = psh.create(); 519 proj.initProject("testtradacti"); 520 proj.addNode("nonode", Constants.Nd.AND_JOIN_NODE); 521 proj.addNode("supernonode", Constants.Nd.AND_JOIN_NODE); 522 proj.setNodeTraditional("supernonode"); 523 proj.addEdge("nonode", "supernonode"); 524 Engine eng = eh.create(); 525 eng.startActivity("testtradacti","nonode"); 526 assertTrue("Supernonode will be initial", proj.getNodeValue("supernonode").getState()== Constants.Nd.INITIAL); 527 eng.terminateActivity("testtradacti","nonode"); 528 assertTrue("Supernonode will be ready",proj.getNodeValue("supernonode").getState() == Constants.Nd.READY); 529 } 530 531 public void testTraditionalAutomaticNode() throws Exception { 532 ProjectSession proj = psh.create(); 533 proj.initProject("testtrad"); 534 proj.addNode("nonode", Constants.Nd.AND_JOIN_NODE); 535 proj.addNode("supernonode", Constants.Nd.AND_JOIN_AUTOMATIC_NODE); 536 proj.setNodeTraditional("supernonode"); 537 proj.addEdge("nonode", "supernonode"); 538 Engine eng = eh.create(); 539 eng.startActivity("testtrad","nonode"); 540 assertTrue("Supernonode will be initial",proj.getNodeValue("supernonode").getState()== Constants.Nd.INITIAL); 541 eng.terminateActivity("testtrad","nonode"); 542 assertTrue("Supernonode will be terminated",proj.getNodeValue("supernonode").getState()== Constants.Nd.TERMINATED); 543 } 544 545 public void testEdgeConditionPropagation() throws Exception { 546 ProjectSession proj = psh.create(); 547 proj.initProject("edgeCondP"); 548 proj.addNode("nonode", Constants.Nd.AND_JOIN_NODE); 549 proj.addNode("supernonode", Constants.Nd.AND_JOIN_NODE); 550 String e1 = proj.addEdge("nonode", "supernonode"); 551 proj.setEdgeCondition(e1,"(node.getName()).equals(\"nonode\")"); 552 Engine eng = eh.create(); 553 eng.startActivity("edgeCondP","nonode"); 554 assertTrue("BnNode State Error nonode",proj.getNodeValue("nonode").getState() == Constants.Nd.EXECUTING); 555 assertTrue("BnNode State Error supernonode",proj.getNodeValue("supernonode").getState() == Constants.Nd.ANTICIPABLE); 556 assertTrue("BnEdge State Error e1",proj.getEdgeValue(e1).getState() == Constants.Ed.ANTICIPATING); 557 eng.terminateActivity("edgeCondP","nonode"); 558 assertTrue("BnNode State Error nonode",proj.getNodeValue("nonode").getState() == Constants.Nd.TERMINATED); 559 assertTrue("BnNode State Error supernonode",proj.getNodeValue("supernonode").getState() == Constants.Nd.READY); 560 assertTrue("BnEdge State Error e1",proj.getEdgeValue(e1).getState() == Constants.Ed.ACTIVE); 561 } 562 563 public void testEdgeConditionPropagationProperty() throws Exception { 564 ProjectSession proj = psh.create(); 565 proj.initProject("edgeCondPP"); 566 proj.addNode("nonode", Constants.Nd.AND_JOIN_NODE); 567 proj.addNode("supernonode", Constants.Nd.AND_JOIN_NODE); 568 proj.setNodeProperty("nonode","prop1","value1",true); 569 String e1 = proj.addEdge("nonode", "supernonode"); 570 proj.setEdgeCondition(e1,"prop1.equals(\"value1\")"); 571 Engine eng = eh.create(); 572 eng.startActivity("edgeCondPP","nonode"); 573 assertTrue("BnNode State Error nonode",proj.getNodeValue("nonode").getState() == Constants.Nd.EXECUTING); 574 assertTrue("BnNode State Error supernonode",proj.getNodeValue("supernonode").getState() == Constants.Nd.ANTICIPABLE); 575 assertTrue("BnEdge State Error e1",proj.getEdgeValue(e1).getState() == Constants.Ed.ANTICIPATING); 576 eng.terminateActivity("edgeCondPP","nonode"); 577 assertTrue("BnNode State Error nonode",proj.getNodeValue("nonode").getState() == Constants.Nd.TERMINATED); 578 assertTrue("BnNode State Error supernonode",proj.getNodeValue("supernonode").getState() == Constants.Nd.READY); 579 assertTrue("BnEdge State Error e1",proj.getEdgeValue(e1).getState() == Constants.Ed.ACTIVE); 580 } 581 582 public void testEdgeConditionNotPropagation() throws Exception { 583 ProjectSession proj = psh.create(); 584 proj.initProject("edgeCondNP"); 585 proj.addNode("nonode", Constants.Nd.AND_JOIN_NODE); 586 proj.addNode("supernonode", Constants.Nd.AND_JOIN_NODE); 587 String e1 = proj.addEdge("nonode", "supernonode"); 588 proj.setEdgeCondition(e1,"(node.getName()).equals(\"supernonode\")"); 589 Engine eng = eh.create(); 590 eng.startActivity("edgeCondNP","nonode"); 591 assertTrue("BnNode State Error nonode",proj.getNodeValue("nonode").getState() == Constants.Nd.EXECUTING); 592 assertTrue("BnNode State Error supernonode",proj.getNodeValue("supernonode").getState() == Constants.Nd.ANTICIPABLE); 593 assertTrue("BnEdge State Error e1",proj.getEdgeValue(e1).getState() == Constants.Ed.ANTICIPATING); 594 eng.terminateActivity("edgeCondNP","nonode"); 595 assertTrue("BnNode State Error nonode",proj.getNodeValue("nonode").getState() == Constants.Nd.TERMINATED); 596 assertTrue("BnNode State Error supernonode",proj.getNodeValue("supernonode").getState() == Constants.Nd.DEAD); 597 assertTrue("BnEdge State Error e1",proj.getEdgeValue(e1).getState() == Constants.Ed.DEAD); 598 } 599 600 public void testEdgeConditionANDSplitPropagation() throws Exception { 601 ProjectSession proj = psh.create(); 602 proj.initProject("edgeCondSP"); 603 proj.addNode("nonode", Constants.Nd.AND_JOIN_NODE); 604 proj.addNode("nonode1", Constants.Nd.AND_JOIN_NODE); 605 proj.addNode("nonode2", Constants.Nd.AND_JOIN_NODE); 606 proj.addNode("supernonode", Constants.Nd.AND_JOIN_NODE); 607 String e1 = proj.addEdge("nonode", "nonode1"); 608 String e2 = proj.addEdge("nonode1", "nonode2"); 609 String e3 = proj.addEdge("nonode1", "supernonode"); 610 proj.setEdgeCondition(e1,"(node.getName()).equals(\"nonode\")"); 611 proj.setEdgeCondition(e2,"(node.getName()).equals(\"nonode1\")"); 612 proj.setEdgeCondition(e3,"(node.getName()).equals(\"nonode1\")"); 613 Engine eng = eh.create(); 614 eng.startActivity("edgeCondSP","nonode"); 615 eng.startActivity("edgeCondSP","nonode1"); 616 617 assertTrue("BnNode State Error nonode",proj.getNodeValue("nonode").getState() == Constants.Nd.EXECUTING); 618 assertTrue("BnNode State Error nonode1",proj.getNodeValue("nonode1").getState() == Constants.Nd.ANTICIPATING); 619 assertTrue("BnNode State Error nonode2",proj.getNodeValue("nonode2").getState() == Constants.Nd.ANTICIPABLE); 620 assertTrue("BnNode State Error supernonode",proj.getNodeValue("supernonode").getState() == Constants.Nd.ANTICIPABLE); 621 assertTrue("BnEdge State Error e1",proj.getEdgeValue(e1).getState() == Constants.Ed.ANTICIPATING); 622 assertTrue("BnEdge State Error e2",proj.getEdgeValue(e2).getState() == Constants.Ed.ANTICIPATING); 623 assertTrue("BnEdge State Error e3",proj.getEdgeValue(e3).getState() == Constants.Ed.ANTICIPATING); 624 625 eng.terminateActivity("edgeCondSP","nonode"); 626 eng.terminateActivity("edgeCondSP","nonode1"); 627 628 assertTrue("BnNode State Error nonode",proj.getNodeValue("nonode").getState() == Constants.Nd.TERMINATED); 629 assertTrue("BnNode State Error nonode1",proj.getNodeValue("nonode1").getState() == Constants.Nd.TERMINATED); 630 assertTrue("BnNode State Error nonode2",proj.getNodeValue("nonode2").getState() == Constants.Nd.READY); 631 assertTrue("BnNode State Error supernonode",proj.getNodeValue("supernonode").getState() == Constants.Nd.READY); 632 assertTrue("BnEdge State Error e1",proj.getEdgeValue(e1).getState() == Constants.Ed.ACTIVE); 633 assertTrue("BnEdge State Error e2",proj.getEdgeValue(e2).getState() == Constants.Ed.ACTIVE); 634 assertTrue("BnEdge State Error e3",proj.getEdgeValue(e3).getState() == Constants.Ed.ACTIVE); 635 } 636 637 public void testEdgeConditionORSplitPropagation() throws Exception { 638 ProjectSession proj = psh.create(); 639 proj.initProject("edgeCondOP"); 640 proj.addNode("nonode", Constants.Nd.AND_JOIN_NODE); 641 proj.addNode("nonode1", Constants.Nd.AND_JOIN_NODE); 642 proj.addNode("nonode2", Constants.Nd.AND_JOIN_NODE); 643 proj.addNode("supernonode", Constants.Nd.AND_JOIN_NODE); 644 String e1 = proj.addEdge("nonode", "nonode1"); 645 String e2 = proj.addEdge("nonode", "nonode2"); 646 String e3 = proj.addEdge("nonode", "supernonode"); 647 proj.setEdgeCondition(e1,"(node.getName()).equals(\"nonode1\")"); 648 proj.setEdgeCondition(e2,"(node.getName()).equals(\"nonode\")"); 649 proj.setEdgeCondition(e3,"(node.getName()).equals(\"nonode1\")"); 650 Engine eng = eh.create(); 651 eng.startActivity("edgeCondOP","nonode"); 652 eng.terminateActivity("edgeCondOP","nonode"); 653 654 assertTrue("BnNode State Error nonode",proj.getNodeValue("nonode").getState() == Constants.Nd.TERMINATED); 655 assertTrue("BnNode State Error nonode1",proj.getNodeValue("nonode1").getState() == Constants.Nd.DEAD); 656 assertTrue("BnNode State Error nonode2",proj.getNodeValue("nonode2").getState() == Constants.Nd.READY); 657 assertTrue("BnNode State Error supernonode",proj.getNodeValue("supernonode").getState() == Constants.Nd.DEAD); 658 assertTrue("BnEdge State Error e1",proj.getEdgeValue(e1).getState() == Constants.Ed.DEAD); 659 assertTrue("BnEdge State Error e2",proj.getEdgeValue(e2).getState() == Constants.Ed.ACTIVE); 660 assertTrue("BnEdge State Error e3",proj.getEdgeValue(e3).getState() == Constants.Ed.DEAD); 661 } 662 663 707 708 } 709 710 | Popular Tags |