1
22
23 package com.liferay.portal.tools;
24
25 import com.liferay.portal.kernel.util.CharPool;
26 import com.liferay.portal.kernel.util.FileUtil;
27 import com.liferay.portal.kernel.util.StringPool;
28 import com.liferay.portal.kernel.util.StringUtil;
29 import com.liferay.portal.kernel.util.UnicodeFormatter;
30 import com.liferay.portal.tools.servicebuilder.ServiceBuilder;
31 import com.liferay.portal.util.InitUtil;
32
33 import java.io.File;
34
35 import java.util.HashMap;
36 import java.util.Map;
37
38 import org.apache.tools.ant.DirectoryScanner;
39
40
46 public class SeleneseToJavaBuilder {
47
48 public static void main(String[] args) throws Exception {
49 InitUtil.initWithSpring();
50
51 if (args.length == 1) {
52 new SeleneseToJavaBuilder(args[0]);
53 }
54 else {
55 throw new IllegalArgumentException();
56 }
57 }
58
59 public SeleneseToJavaBuilder(String basedir) throws Exception {
60 DirectoryScanner ds = new DirectoryScanner();
61
62 ds.setBasedir(basedir);
63 ds.setIncludes(new String[] {"**\\*.html"});
64
65 ds.scan();
66
67 String[] files = ds.getIncludedFiles();
68
69 for (int i = 0; i < files.length; i++) {
70
71
75
84
85 translate(basedir, files[i]);
86 }
87 }
88
89 protected String fixParam(String param) {
90 StringBuilder sb = new StringBuilder();
91
92 char[] array = param.toCharArray();
93
94 for (int i = 0; i < array.length; ++i) {
95 char c = array[i];
96
97 if (c == CharPool.BACK_SLASH) {
98 sb.append("\\\\");
99 }
100 else if (c == CharPool.QUOTE) {
101 sb.append("\\\"");
102 }
103 else if (Character.isWhitespace(c)) {
104 sb.append(c);
105 }
106 else if ((c < 0x0020) || (c > 0x007e)) {
107 sb.append("\\u");
108 sb.append(UnicodeFormatter.charToHex(c));
109 }
110 else {
111 sb.append(c);
112 }
113 }
114
115 return StringUtil.replace(
116 sb.toString(), _FIX_PARAM_OLD_SUBS, _FIX_PARAM_NEW_SUBS);
117 }
118
119 protected String[] getParams(String step) throws Exception {
120 String[] params = new String[3];
121
122 int x = 0;
123 int y = 0;
124
125 for (int i = 0; i < 3; i++) {
126 x = step.indexOf("<td>", x) + 4;
127 y = step.indexOf("\n", x);
128 y = step.lastIndexOf("</td>", y);
129
130 params[i] = step.substring(x, y);
131 }
132
133 return params;
134 }
135
136 protected void translate(String basedir, String file) throws Exception {
137 file = StringUtil.replace(
138 file, StringPool.BACK_SLASH, StringPool.SLASH);
139
140 int x = file.lastIndexOf(StringPool.SLASH);
141 int y = file.indexOf(StringPool.PERIOD);
142
143 String testPackagePath = StringUtil.replace(
144 file.substring(0, x), StringPool.SLASH, StringPool.PERIOD);
145 String testName = file.substring(x + 1, y);
146 String testMethodName =
147 "test" + testName.substring(0, testName.length() - 4);
148 String testFileName = basedir + "/" + file.substring(0, y) + ".java";
149
150 StringBuilder sb = new StringBuilder();
151
152 sb.append("package " + testPackagePath + ";\n\n");
153
154 sb.append("import com.liferay.portal.kernel.util.FileUtil;\n");
155 sb.append("import com.liferay.portal.kernel.util.StringPool;\n");
156 sb.append("import com.liferay.portalweb.portal.BaseTestCase;\n\n");
157 sb.append(
158 "import com.liferay.portalweb.portal.util.RuntimeVariables;\n\n");
159
160 sb.append("public class " + testName + " extends BaseTestCase {");
161
162 sb.append("public void " + testMethodName + "() throws Exception {");
163
164 String xml = FileUtil.read(basedir + "/" + file);
165
166 if ((xml.indexOf("<title>" + testName + "</title>") == -1) ||
167 (xml.indexOf("colspan=\"3\">" + testName + "</td>") == -1)) {
168
169 System.out.println(testName + " has an invalid test name");
170 }
171
172 if (xml.indexOf(""") != -1) {
173 xml = StringUtil.replace(xml, """, "\"");
174
175 FileUtil.write(basedir + "/" + file, xml);
176 }
177
178 x = xml.indexOf("<tbody>");
179 y = xml.indexOf("</tbody>");
180
181 xml = xml.substring(x, y + 8);
182
183 Map<String, String> labels = new HashMap<String, String>();
184
185 int labelCount = 1;
186
187 x = 0;
188 y = 0;
189
190 while (true) {
191 x = xml.indexOf("<tr>", x);
192 y = xml.indexOf("\n</tr>", x);
193
194 if ((x == -1) || (y == -1)) {
195 break;
196 }
197
198 x += 6;
199 y++;
200
201 String step = xml.substring(x, y);
202
203 String[] params = getParams(step);
204
205 String param1 = params[0];
206 String param2 = fixParam(params[1]);
207
208 if (param1.equals("label")) {
209 String label = labels.get(param2);
210
211 if (label == null) {
212 labelCount++;
213
214 label = labels.put(param2, String.valueOf(labelCount));
215 }
216 }
217 }
218
219 if (labels.size() > 0) {
220 sb.append("int label = 1;");
221
222 sb.append("while (label >= 1) {");
223 sb.append("switch (label) {");
224 sb.append("case 1:");
225 }
226
227 x = 0;
228 y = 0;
229
230 while (true) {
231 x = xml.indexOf("<tr>", x);
232 y = xml.indexOf("\n</tr>", x);
233
234 if ((x == -1) || (y == -1)) {
235 break;
236 }
237
238 x += 6;
239 y++;
240
241 String step = xml.substring(x, y);
242
243 String[] params = getParams(step);
244
245 String param1 = params[0];
246 String param2 = fixParam(params[1]);
247 String param3 = fixParam(params[2]);
248
249 if (param1.equals("addSelection") || param1.equals("select") ||
250 param1.equals("type") || param1.equals("typeKeys") ||
251 param1.equals("waitForPopUp")) {
252
253 sb.append("selenium.");
254 sb.append(param1);
255 sb.append("(\"");
256 sb.append(param2);
257 sb.append("\", RuntimeVariables.replace(\"");
258 sb.append(param3);
259 sb.append("\"));");
260 }
261 else if (param1.equals("assertAlert") ||
262 param1.equals("assertNotAlert")) {
263
264 if (param1.equals("assertAlert")) {
265 sb.append("assertEquals");
266 }
267 else if (param1.equals("assertNotAlert")) {
268 sb.append("assertNotEquals");
269 }
270
271 sb.append("(\"");
272 sb.append(param2);
273 sb.append("\", selenium.getAlert());");
274 }
275 else if (param1.equals("assertChecked") ||
276 param1.equals("assertNotChecked")) {
277
278 if (param1.equals("assertChecked")) {
279 sb.append("assertTrue");
280 }
281 else if (param1.equals("assertNotChecked")) {
282 sb.append("assertFalse");
283 }
284
285 sb.append("(selenium.isChecked(\"");
286 sb.append(param2);
287 sb.append("\"));");
288 }
289 else if (param1.equals("assertConfirmation")) {
290 param2 = StringUtil.replace(param2, "?", "[\\\\s\\\\S]");
291
292 sb.append("assertTrue(selenium.getConfirmation().matches(\"^");
293 sb.append(param2);
294 sb.append("$\"));");
295 }
296 else if (param1.equals("assertLocation") ||
297 param1.equals("assertNotLocation")) {
298
299 if (param1.equals("assertLocation")) {
300 sb.append("assertEquals");
301 }
302 else if (param1.equals("assertNotLocation")) {
303 sb.append("assertNotEquals");
304 }
305
306 sb.append("(\"");
307 sb.append(param2);
308 sb.append("\", selenium.getLocation());");
309 }
310 else if (param1.equals("assertElementNotPresent") ||
311 param1.equals("assertElementPresent")) {
312
313 if (param1.equals("assertElementNotPresent")) {
314 sb.append("assertFalse");
315 }
316 else if (param1.equals("assertElementPresent")) {
317 sb.append("assertTrue");
318 }
319
320 sb.append("(selenium.isElementPresent(\"");
321 sb.append(param2);
322 sb.append("\"));");
323 }
324 else if (param1.equals("assertNotText") ||
325 param1.equals("assertText")) {
326
327 if (param1.equals("assertNotText")) {
328 sb.append("assertNotEquals");
329 }
330 else if (param1.equals("assertText")) {
331 sb.append("assertEquals");
332 }
333
334 sb.append("(\"");
335 sb.append(param3);
336 sb.append("\", selenium.getText(\"");
337 sb.append(param2);
338 sb.append("\"));");
339 }
340 else if (param1.equals("assertNotValue") ||
341 param1.equals("assertValue")) {
342
343 if (param1.equals("assertNotValue")) {
344 sb.append("assertNotEquals");
345 }
346 else if (param1.equals("assertValue")) {
347 sb.append("assertEquals");
348 }
349
350 sb.append("(\"");
351 sb.append(param3);
352 sb.append("\", selenium.getValue(\"");
353 sb.append(param2);
354 sb.append("\"));");
355 }
356 else if (param1.equals("assertNotVisible") ||
357 param1.equals("assertVisible")) {
358
359 if (param1.equals("assertNotVisible")) {
360 sb.append("assertFalse");
361 }
362 else if (param1.equals("assertVisible")) {
363 sb.append("assertTrue");
364 }
365
366 sb.append("(");
367 sb.append("selenium.isVisible(\"");
368 sb.append(param2);
369 sb.append("\"));");
370 }
371 else if (param1.equals("assertSelectOptions")) {
372 String[] expectedArray = StringUtil.split(param3);
373
374 sb.append("String[] actualArray = ");
375 sb.append("selenium.getSelectOptions(\"");
376 sb.append(param2);
377 sb.append("\");");
378
379 sb.append("assertEquals(");
380 sb.append(expectedArray.length);
381 sb.append(", actualArray.length);");
382
383 for (int i = 0; i < expectedArray.length; i++) {
384 sb.append("assertEquals(\"");
385 sb.append(expectedArray[i]);
386 sb.append("\", actualArray[");
387 sb.append(i);
388 sb.append("]);");
389 }
390 }
391 else if (param1.equals("assertTextNotPresent") ||
392 param1.equals("assertTextPresent")) {
393
394 if (param1.equals("assertTextNotPresent")) {
395 sb.append("assertFalse");
396 }
397 else if (param1.equals("assertTextPresent")) {
398 sb.append("assertTrue");
399 }
400
401 sb.append("(selenium.isTextPresent(\"");
402 sb.append(param2);
403 sb.append("\"));");
404 }
405 else if (param1.equals("captureEntirePageScreenshot")) {
406 int pos = param2.lastIndexOf("\\");
407
408 String dirName = param2.substring(0, pos + 1);
409
410 sb.append("FileUtil.mkdirs(RuntimeVariables.replace(\"");
411 sb.append(dirName);
412 sb.append("\"));");
413 sb.append("selenium.captureEntirePageScreenshot(");
414 sb.append("RuntimeVariables.replace(\"");
415 sb.append(param2);
416 sb.append("\"), \"\");");
417 }
418 else if (param1.equals("check") || param1.equals("click") ||
419 param1.equals("mouseDown") || param1.equals("mouseUp") ||
420 param1.equals("open") || param1.equals("uncheck") ||
421 param1.equals("selectFrame") ||
422 param1.equals("selectWindow")) {
423
424 sb.append("selenium.");
425 sb.append(param1);
426 sb.append("(\"");
427 sb.append(param2);
428 sb.append("\");");
429 }
430 else if (param1.equals("clickAndWait")) {
431 sb.append("selenium.click(RuntimeVariables.replace(\"");
432 sb.append(param2);
433 sb.append("\"));");
434 sb.append("selenium.waitForPageToLoad(\"30000\");");
435 }
436 else if (param1.equals("close")) {
437 sb.append("selenium.");
438 sb.append(param1);
439 sb.append("();");
440 }
441 else if (param1.equals("dragAndDropToObject")) {
442 sb.append("selenium.");
443 sb.append("dragAndDropToObject(\"");
444 sb.append(param2);
445 sb.append("\", \"");
446 sb.append(param3);
447 sb.append("\");");
448 }
449 else if (param1.equals("gotoIf")) {
450 String conditional = StringUtil.replace(
451 param2, new String[] {"${", "}"}, new String[] {"", ""});
452
453 sb.append("if (");
454 sb.append(conditional);
455 sb.append(") {");
456 sb.append("label =");
457 sb.append(labels.get(param3));
458 sb.append(";");
459 sb.append("continue;");
460 sb.append("}");
461 }
462 else if (param1.equals("label")) {
463 String label = labels.get(param2);
464
465 sb.append("case ");
466 sb.append(label);
467 sb.append(":");
468 }
469 else if (param1.equals("pause")) {
470 sb.append("Thread.sleep(");
471 sb.append(param2);
472 sb.append(");");
473 }
474 else if (param1.equals("selectAndWait")) {
475 sb.append("selenium.select(\"");
476 sb.append(param2);
477 sb.append("\", \"");
478 sb.append(param3);
479 sb.append("\");");
480 sb.append("selenium.waitForPageToLoad(\"30000\");");
481 }
482 else if (param1.equals("store")) {
483 sb.append("boolean ");
484 sb.append(param3);
485 sb.append(" = ");
486
487 if (param2.startsWith("eval(")) {
488 String eval = param2.substring(5, param2.length() - 1);
489
490 eval = StringUtil.replace(eval, "'", "\"");
491
492 sb.append(eval);
493 }
494
495 sb.append(";");
496 }
497 else if (param1.equals("storeText")) {
498 sb.append("String ");
499 sb.append(param3);
500 sb.append(" = selenium.getText(\"");
501 sb.append(param2);
502 sb.append("\");");
503
504 sb.append("RuntimeVariables.setValue(\"");
505 sb.append(param3);
506 sb.append("\", ");
507 sb.append(param3);
508 sb.append(");");
509 }
510 else if (param1.equals("verifyElementNotPresent") ||
511 param1.equals("verifyElementPresent")) {
512
513 if (param1.equals("verifyElementNotPresent")) {
514 sb.append("verifyFalse");
515 }
516 else if (param1.equals("verifyElementPresent")) {
517 sb.append("verifyTrue");
518 }
519
520 sb.append("(selenium.isElementPresent(\"");
521 sb.append(param2);
522 sb.append("\"));");
523 }
524 else if (param1.equals("verifyTextNotPresent") ||
525 param1.equals("verifyTextPresent")) {
526
527 if (param1.equals("verifyTextNotPresent")) {
528 sb.append("verifyFalse");
529 }
530 else if (param1.equals("verifyTextPresent")) {
531 sb.append("verifyTrue");
532 }
533
534 sb.append("(selenium.isTextPresent(\"");
535 sb.append(param2);
536 sb.append("\"));");
537 }
538 else if (param1.equals("verifyTitle")) {
539 sb.append("verifyEquals(\"");
540 sb.append(param2);
541 sb.append("\", selenium.getTitle());");
542 }
543 else if (param1.equals("waitForElementNotPresent") ||
544 param1.equals("waitForElementPresent") ||
545 param1.equals("waitForTextNotPresent") ||
546 param1.equals("waitForTextPresent")) {
547
548 sb.append("for (int second = 0;; second++) {");
549 sb.append("if (second >= 60) {");
550 sb.append("fail(\"timeout\");");
551 sb.append("}");
552
553 sb.append("try {");
554 sb.append("if (");
555
556 if (param1.equals("waitForElementNotPresent") ||
557 param1.equals("waitForTextNotPresent")) {
558
559 sb.append("!");
560 }
561
562 sb.append("selenium.");
563
564 if (param1.equals("waitForElementNotPresent") ||
565 param1.equals("waitForElementPresent")) {
566
567 sb.append("isElementPresent");
568 }
569 else if (param1.equals("waitForTextNotPresent") ||
570 param1.equals("waitForTextPresent")) {
571
572 sb.append("isTextPresent");
573 }
574
575 sb.append("(\"");
576 sb.append(param2);
577 sb.append("\")) {");
578 sb.append("break;");
579 sb.append("}");
580 sb.append("}");
581 sb.append("catch (Exception e) {");
582 sb.append("}");
583
584 sb.append("Thread.sleep(1000);");
585 sb.append("}");
586 }
587 else if (param1.equals("waitForNotVisible") ||
588 param1.equals("waitForVisible")) {
589
590 sb.append("for (int second = 0;; second++) {");
591 sb.append("if (second >= 60) {");
592 sb.append("fail(\"timeout\");");
593 sb.append("}");
594
595 sb.append("try {");
596 sb.append("if (");
597
598 if (param1.equals("waitForNotVisible")) {
599 sb.append("!");
600 }
601
602 sb.append("selenium.isVisible");
603 sb.append("(\"");
604 sb.append(param2);
605 sb.append("\")) {");
606 sb.append("break;");
607 sb.append("}");
608 sb.append("}");
609 sb.append("catch (Exception e) {");
610 sb.append("}");
611
612 sb.append("Thread.sleep(1000);");
613 sb.append("}");
614 }
615 else if (param1.equals("waitForTable")) {
616 sb.append("for (int second = 0;; second++) {");
617 sb.append("if (second >= 60) {");
618 sb.append("fail(\"timeout\");");
619 sb.append("}");
620
621 sb.append("try {");
622 sb.append("if (StringPool.BLANK.equals(selenium.getTable(\"");
623 sb.append(param2);
624 sb.append("\"))) {");
625 sb.append("break;");
626 sb.append("}");
627 sb.append("}");
628 sb.append("catch (Exception e) {");
629 sb.append("}");
630
631 sb.append("Thread.sleep(1000);");
632 sb.append("}");
633 }
634 else {
635 System.out.println(param1 + " was not translated");
636 }
637 }
638
639 if (labels.size() > 0) {
640 sb.append("case 100:");
641 sb.append("label = -1;");
642 sb.append("}");
643 sb.append("}");
644 }
645
646 sb.append("}");
647 sb.append("}");
648
649 String content = sb.toString();
650
651 ServiceBuilder.writeFile(new File(testFileName), content);
652 }
653
654 private static final String[] _FIX_PARAM_OLD_SUBS = new String[] {
655 "\\\\n", "<br />"
656 };
657
658 private static final String[] _FIX_PARAM_NEW_SUBS = new String[] {
659 "\\n", "\\n"
660 };
661
662 }