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