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