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