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("keyPress") ||
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("assertNotText") ||
355 param1.equals("assertText")) {
356
357 if (param1.equals("assertNotText")) {
358 sb.append("assertNotEquals");
359 }
360 else if (param1.equals("assertText")) {
361 sb.append("assertEquals");
362 }
363
364 sb.append("(RuntimeVariables.replace(\"");
365 sb.append(param3);
366 sb.append("\"), selenium.getText(\"");
367 sb.append(param2);
368 sb.append("\"));");
369 }
370 else if (param1.equals("assertNotValue") ||
371 param1.equals("assertValue")) {
372
373 if (param1.equals("assertNotValue")) {
374 sb.append("assertNotEquals");
375 }
376 else if (param1.equals("assertValue")) {
377 sb.append("assertEquals");
378 }
379
380 sb.append("(\"");
381 sb.append(param3);
382 sb.append("\", selenium.getValue(\"");
383 sb.append(param2);
384 sb.append("\"));");
385 }
386 else if (param1.equals("assertNotVisible") ||
387 param1.equals("assertVisible")) {
388
389 if (param1.equals("assertNotVisible")) {
390 sb.append("assertFalse");
391 }
392 else if (param1.equals("assertVisible")) {
393 sb.append("assertTrue");
394 }
395
396 sb.append("(");
397 sb.append("selenium.isVisible(\"");
398 sb.append(param2);
399 sb.append("\"));");
400 }
401 else if (param1.equals("assertSelectOptions")) {
402 String[] expectedArray = StringUtil.split(param3);
403
404 sb.append("String[] actualArray = ");
405 sb.append("selenium.getSelectOptions(\"");
406 sb.append(param2);
407 sb.append("\");");
408
409 sb.append("assertEquals(");
410 sb.append(expectedArray.length);
411 sb.append(", actualArray.length);");
412
413 for (int i = 0; i < expectedArray.length; i++) {
414 sb.append("assertEquals(\"");
415 sb.append(expectedArray[i]);
416 sb.append("\", actualArray[");
417 sb.append(i);
418 sb.append("]);");
419 }
420 }
421 else if (param1.equals("assertTextNotPresent") ||
422 param1.equals("assertTextPresent")) {
423
424 if (param1.equals("assertTextNotPresent")) {
425 sb.append("assertFalse");
426 }
427 else if (param1.equals("assertTextPresent")) {
428 sb.append("assertTrue");
429 }
430
431 sb.append("(selenium.isTextPresent(\"");
432 sb.append(param2);
433 sb.append("\"));");
434 }
435 else if (param1.equals("captureEntirePageScreenshot")) {
436 int pos = param2.lastIndexOf("\\");
437
438 String dirName = param2.substring(0, pos + 1);
439
440 sb.append("FileUtil.mkdirs(RuntimeVariables.replace(\"");
441 sb.append(dirName);
442 sb.append("\"));");
443 sb.append("selenium.captureEntirePageScreenshot(");
444 sb.append("RuntimeVariables.replace(\"");
445 sb.append(param2);
446 sb.append("\"), \"\");");
447 }
448 else if (param1.equals("check") || param1.equals("click") ||
449 param1.equals("mouseDown") || param1.equals("mouseUp") ||
450 param1.equals("open") || param1.equals("uncheck") ||
451 param1.equals("selectFrame") ||
452 param1.equals("selectWindow")) {
453
454 sb.append("selenium.");
455 sb.append(param1);
456 sb.append("(\"");
457 sb.append(param2);
458 sb.append("\");");
459 }
460 else if (param1.equals("clickAndWait")) {
461 sb.append("selenium.click(RuntimeVariables.replace(\"");
462 sb.append(param2);
463 sb.append("\"));");
464 sb.append("selenium.waitForPageToLoad(\"30000\");");
465 }
466 else if (param1.equals("close") || param1.equals("refresh")) {
467 sb.append("selenium.");
468 sb.append(param1);
469 sb.append("();");
470 }
471 else if (param1.equals("dragAndDropToObject")) {
472 sb.append("selenium.");
473 sb.append("dragAndDropToObject(\"");
474 sb.append(param2);
475 sb.append("\", \"");
476 sb.append(param3);
477 sb.append("\");");
478 }
479 else if (param1.equals("echo")) {
480 sb.append("System.out.println(\"");
481 sb.append(param2);
482 sb.append("\");");
483 }
484 else if (param1.equals("gotoIf")) {
485 String conditional = StringUtil.replace(
486 param2, new String[] {"${", "}"}, new String[] {"", ""});
487
488 sb.append("if (");
489 sb.append(conditional);
490 sb.append(") {");
491 sb.append("label =");
492 sb.append(labels.get(param3));
493 sb.append(";");
494 sb.append("continue;");
495 sb.append("}");
496 }
497 else if (param1.equals("keyPressAndWait")) {
498 sb.append("selenium.keyPress(\"");
499 sb.append(param2);
500 sb.append("\", RuntimeVariables.replace(\"");
501 sb.append(param3);
502 sb.append("\"));");
503 sb.append("selenium.waitForPageToLoad(\"30000\");");
504 }
505 else if (param1.equals("label")) {
506 String label = labels.get(param2);
507
508 sb.append("case ");
509 sb.append(label);
510 sb.append(":");
511 }
512 else if (param1.equals("pause")) {
513 sb.append("Thread.sleep(");
514 sb.append(param2);
515 sb.append(");");
516 }
517 else if (param1.equals("refreshAndWait")) {
518 sb.append("selenium.refresh();");
519 sb.append("selenium.waitForPageToLoad(\"30000\");");
520 }
521 else if (param1.equals("selectAndWait")) {
522 sb.append("selenium.select(\"");
523 sb.append(param2);
524 sb.append("\", \"");
525 sb.append(param3);
526 sb.append("\");");
527 sb.append("selenium.waitForPageToLoad(\"30000\");");
528 }
529 else if (param1.equals("store")) {
530 sb.append("boolean ");
531 sb.append(param3);
532 sb.append(" = ");
533
534 if (param2.startsWith("eval(")) {
535 String eval = param2.substring(5, param2.length() - 1);
536
537 eval = StringUtil.replace(eval, "'", "\"");
538
539 sb.append(eval);
540 }
541
542 sb.append(";");
543 }
544 else if (param1.equals("storeIncrementedText")) {
545 sb.append("String ");
546 sb.append(param3);
547 sb.append(" = selenium.getIncrementedText(\"");
548 sb.append(param2);
549 sb.append("\");");
550
551 sb.append("RuntimeVariables.setValue(\"");
552 sb.append(param3);
553 sb.append("\", ");
554 sb.append(param3);
555 sb.append(");");
556 }
557 else if (param1.equals("storeText")) {
558 sb.append("String ");
559 sb.append(param3);
560 sb.append(" = selenium.getText(\"");
561 sb.append(param2);
562 sb.append("\");");
563
564 sb.append("RuntimeVariables.setValue(\"");
565 sb.append(param3);
566 sb.append("\", ");
567 sb.append(param3);
568 sb.append(");");
569 }
570 else if (param1.equals("verifyElementNotPresent") ||
571 param1.equals("verifyElementPresent")) {
572
573 if (param1.equals("verifyElementNotPresent")) {
574 sb.append("verifyFalse");
575 }
576 else if (param1.equals("verifyElementPresent")) {
577 sb.append("verifyTrue");
578 }
579
580 sb.append("(selenium.isElementPresent(\"");
581 sb.append(param2);
582 sb.append("\"));");
583 }
584 else if (param1.equals("verifyTextNotPresent") ||
585 param1.equals("verifyTextPresent")) {
586
587 if (param1.equals("verifyTextNotPresent")) {
588 sb.append("verifyFalse");
589 }
590 else if (param1.equals("verifyTextPresent")) {
591 sb.append("verifyTrue");
592 }
593
594 sb.append("(selenium.isTextPresent(\"");
595 sb.append(param2);
596 sb.append("\"));");
597 }
598 else if (param1.equals("verifyTitle")) {
599 sb.append("verifyEquals(\"");
600 sb.append(param2);
601 sb.append("\", selenium.getTitle());");
602 }
603 else if (param1.equals("waitForElementNotPresent") ||
604 param1.equals("waitForElementPresent") ||
605 param1.equals("waitForNotPartialText") ||
606 param1.equals("waitForPartialText") ||
607 param1.equals("waitForTextNotPresent") ||
608 param1.equals("waitForTextPresent")) {
609
610 sb.append("for (int second = 0;; second++) {");
611 sb.append("if (second >= 60) {");
612 sb.append("fail(\"timeout\");");
613 sb.append("}");
614
615 sb.append("try {");
616 sb.append("if (");
617
618 if (param1.equals("waitForElementNotPresent") ||
619 param1.equals("waitForNotPartialText") ||
620 param1.equals("waitForTextNotPresent")) {
621
622 sb.append("!");
623 }
624
625 sb.append("selenium.");
626
627 if (param1.equals("waitForElementNotPresent") ||
628 param1.equals("waitForElementPresent")) {
629
630 sb.append("isElementPresent");
631 sb.append("(\"");
632 sb.append(param2);
633 sb.append("\")");
634 }
635 else if (param1.equals("waitForTextNotPresent") ||
636 param1.equals("waitForTextPresent")) {
637
638 sb.append("isTextPresent");
639 sb.append("(\"");
640 sb.append(param2);
641 sb.append("\")");
642 }
643 else if (param1.equals("waitForNotPartialText") ||
644 param1.equals("waitForPartialText")) {
645
646 sb.append("isPartialText(\"");
647 sb.append(param2);
648 sb.append("\", ");
649
650 if (param3.startsWith("${")) {
651 sb.append("RuntimeVariables.getValue(\"");
652
653 String text = param3.substring(2, param3.length() - 1);
654
655 sb.append(text);
656 sb.append("\")");
657 }
658 else {
659 sb.append("\"");
660 sb.append(param3);
661 sb.append("\"");
662 }
663
664 sb.append(")");
665 }
666
667 sb.append(") {");
668 sb.append("break;");
669 sb.append("}");
670 sb.append("}");
671 sb.append("catch (Exception e) {");
672 sb.append("}");
673
674 sb.append("Thread.sleep(1000);");
675 sb.append("}");
676 }
677 else if (param1.equals("waitForNotVisible") ||
678 param1.equals("waitForVisible")) {
679
680 sb.append("for (int second = 0;; second++) {");
681 sb.append("if (second >= 60) {");
682 sb.append("fail(\"timeout\");");
683 sb.append("}");
684
685 sb.append("try {");
686 sb.append("if (");
687
688 if (param1.equals("waitForNotVisible")) {
689 sb.append("!");
690 }
691
692 sb.append("selenium.isVisible");
693 sb.append("(\"");
694 sb.append(param2);
695 sb.append("\")) {");
696 sb.append("break;");
697 sb.append("}");
698 sb.append("}");
699 sb.append("catch (Exception e) {");
700 sb.append("}");
701
702 sb.append("Thread.sleep(1000);");
703 sb.append("}");
704 }
705 else if (param1.equals("waitForTable")) {
706 sb.append("for (int second = 0;; second++) {");
707 sb.append("if (second >= 60) {");
708 sb.append("fail(\"timeout\");");
709 sb.append("}");
710
711 sb.append("try {");
712 sb.append("if (StringPool.BLANK.equals(selenium.getTable(\"");
713 sb.append(param2);
714 sb.append("\"))) {");
715 sb.append("break;");
716 sb.append("}");
717 sb.append("}");
718 sb.append("catch (Exception e) {");
719 sb.append("}");
720
721 sb.append("Thread.sleep(1000);");
722 sb.append("}");
723 }
724 else {
725 System.out.println(param1 + " was not translated");
726 }
727 }
728
729 if (labels.size() > 0) {
730 sb.append("case 100:");
731 sb.append("label = -1;");
732 sb.append("}");
733 sb.append("}");
734 }
735
736 sb.append("}");
737 sb.append("}");
738
739 String content = sb.toString();
740
741 ServiceBuilder.writeFile(new File(testFileName), content);
742 }
743
744 private static final String[] _FIX_PARAM_OLD_SUBS = new String[] {
745 "\\\\n", "<br />"
746 };
747
748 private static final String[] _FIX_PARAM_NEW_SUBS = new String[] {
749 "\\n", "\\n"
750 };
751
752 }