1 package org.jahia.clipbuilder.html.web; 2 import java.util.*; 3 4 import javax.servlet.http.*; 5 6 import org.htmlparser.*; 7 import org.htmlparser.tags.*; 8 import org.htmlparser.util.*; 9 import org.jahia.clipbuilder.html.*; 10 import org.jahia.clipbuilder.html.bean.*; 11 import org.jahia.clipbuilder.html.util.*; 12 import org.jahia.clipbuilder.html.web.Constant.*; 13 import org.jahia.clipbuilder.html.web.Url.*; 14 import org.jahia.clipbuilder.html.web.html.*; 15 16 21 public class WebBrowserSimulator { 22 private int urlPosition = 0; 23 private HttpServletRequest request; 24 private HttpServletResponse response; 25 private ClipperBean clipperBean; 26 private HTMLDocument finalDocument; 27 private boolean finished; 28 31 public static final int MODE_LOOP = 0; 32 35 public static final int MODE_REFRESH_ONLOAD = 1; 36 private static org.apache.log4j.Logger logger = org.apache.log4j.Logger.getLogger(WebBrowserSimulator.class); 37 38 39 46 public WebBrowserSimulator(HttpServletRequest request, HttpServletResponse response, ClipperBean cBean) { 47 setRequest(request); 48 setResponse(response); 49 setClipperBean(cBean); 50 51 } 52 53 54 57 58 63 public void setRequest(HttpServletRequest request) { 64 this.request = request; 65 } 66 67 68 73 public void setResponse(HttpServletResponse response) { 74 this.response = response; 75 } 76 77 78 83 public void setClipperBean(ClipperBean clipperBean) { 84 if (clipperBean != null) { 85 this.clipperBean = clipperBean; 86 } 87 else { 88 logger.error("[ ClipperBean is null]"); 89 } 90 } 91 92 93 98 public void setFinalDocument(HTMLDocument finalDocument) { 99 this.finalDocument = finalDocument; 100 } 101 102 103 108 public void setUrlPosition(int urlPosition) { 109 this.urlPosition = urlPosition; 110 } 111 112 113 118 public void setFinished(boolean finished) { 119 this.finished = finished; 120 } 121 122 123 124 125 130 public String getHTMLPart() { 131 logger.debug(" Extract html part"); 132 String selectedPart = null; 134 135 ClipperBean bean = getClipperBean(); 136 if (bean == null) { 137 logger.error("[ClipperBean not found]"); 138 } 139 FilterBean filterBean = bean.getFilterBean(); 140 logger.debug("[Filter class: " + filterBean.getClass().toString() + " ]"); 141 142 ExtractorFilter filter = ExtractorFilterFactory.getInstance().getFilterImplementation(filterBean.getName()); 144 Map keyMap = filterBean.getKeyMap(); 145 filter.setKeyMap(keyMap); 146 int mode = filterBean.getMode(); 147 filter.setMode(mode); 148 try { 149 selectedPart = filter.getSelectedPart(getFinalDocument(), ExtractorFilter.ACTION_RETRIEVE_SELECTED_PART); 150 151 } 152 catch (Exception ex) { 153 ex.printStackTrace(); 154 selectedPart = " Error has occured"; 155 } 156 finally { 157 158 return embedHtml(selectedPart); 160 } 162 163 } 164 165 166 171 public HttpServletRequest getRequest() { 172 return request; 173 } 174 175 176 181 public HttpServletResponse getResponse() { 182 return response; 183 } 184 185 186 191 public ClipperBean getClipperBean() { 192 return clipperBean; 193 } 194 195 196 201 public HTMLDocument getFinalDocument() { 202 return finalDocument; 203 } 204 205 206 211 public int getUrlPosition() { 212 return urlPosition; 213 } 214 215 216 221 public boolean isFinished() { 222 return finished; 223 } 224 225 226 231 public String getNameSpace() { 232 return RequestParameterManager.getNameSpace(getRequest()); 233 } 234 235 236 241 public String getFinalHtmlResponse() { 242 String html = "not Found"; 243 try { 244 logger.debug("[ Get HTML Reponse ]"); 245 if (false) { 246 html = getFinalDocument().getUserDocumentAsString(); 247 248 html = simulateUserInteraction(html, getFinalDocument().getUrlBean()); 250 } 251 else { 252 html = getFinalDocument().getUserDocumentAsString(); 253 } 254 } 255 catch (NumberFormatException ex) { 256 ex.printStackTrace(); 257 } 258 catch (Exception ex) { 259 ex.printStackTrace(); 260 } 261 return html; 262 } 263 264 265 270 public Hashtable getHeaderParams() { 271 Hashtable headerParamHash = new Hashtable(); 272 283 return headerParamHash; 284 } 285 286 287 293 public URLMap getURLMap(HttpServletRequest request) { 294 return SessionManager.getHTMLDocumentBuilder(request).getUrlMap(); 295 } 296 297 298 304 public Map getParam(HttpServletRequest request) { 305 return org.jahia.clipbuilder.html.struts.webBrowser.WebBrowserAction.getParam(request); 306 } 307 308 309 314 public void execute(int mode) { 315 switch (mode) { 316 317 case MODE_LOOP: 319 { 320 try { 321 executeLoop(); 322 } 323 catch (Exception ex) { 324 System.err.println("coucou erro"); 325 ex.printStackTrace(); 326 } 327 break; 328 } 329 case MODE_REFRESH_ONLOAD: 331 { 332 try { 333 executeWhithJavascript(); 334 335 } 336 catch (Exception ex) { 337 ex.printStackTrace(); 338 } 339 break; 340 } 341 default: 343 { 344 try { 345 executeLoop(); 346 } 347 catch (Exception ex) { 348 ex.printStackTrace(); 349 } 350 break; 351 } 352 353 } 354 } 355 356 357 364 public void executeForLoad(HttpServletRequest request, HttpServletResponse response, int mode) { 365 initHTMLDocumentBuilder(request, response); 367 368 execute(mode); 370 } 371 372 373 379 private String embedHtml(String htmlPart) { 380 String id = getNameSpace(); 382 String iframeJavascriptPath = getRequest().getContextPath() + "/js/iframeJavascript.js"; 383 String waitImgPath = getRequest().getContextPath() + "/resources/work_in_progress.gif"; 384 385 String embedHtml = " <html>"; 386 embedHtml = embedHtml + "\n" + "<head>"; 387 embedHtml = embedHtml + "\n" + "<script type=\"text/javascript\" SRC=\"" + iframeJavascriptPath + "\"></script>"; 388 embedHtml = embedHtml + "\n" + "</head>"; 389 embedHtml = embedHtml + "\n" + "<body onload=\"javascript:resizeIframe('" + id + "');\">"; 390 embedHtml = embedHtml + "\n" + "<div id=\"content\">"; 392 embedHtml = embedHtml + "\n" + htmlPart; 393 embedHtml = embedHtml + "\n" + "</div>"; 394 embedHtml = embedHtml + "\n" + "</body>"; 395 embedHtml = embedHtml + "\n" + "</html>"; 396 397 return embedHtml; 398 } 399 400 401 406 private void executeLoop() throws Exception { 407 ClipperBean cBean = getClipperBean(); 409 List urlListBean = cBean.getUrlListBean(); 410 HTMLDocument doc = null; 411 412 for (int i = 0; i < urlListBean.size(); i++) { 414 UrlBean uBean = (UrlBean) urlListBean.get(i); 415 logger.debug("[WebBrowserSimulator] Current url: " + uBean.getAbsoluteUrlValue()); 417 418 doc = updateUrlBeanAndGetDocument(getRequest(), getResponse(), uBean); 420 421 String html = doc.getUserDocumentAsString(); 423 426 uBean.setDocument(doc); 427 urlPosition = i; 429 } 430 431 setFinished(true); 432 433 setFinalDocument(doc); 435 436 } 437 438 439 445 private void initHTMLDocumentBuilder(HttpServletRequest request, HttpServletResponse response) { 446 ClipperBean cBean = SessionManager.getClipperBean(request); 447 URLWrapper uw = new URLWrapper(); 448 uw.setSourceUrl(cBean.getTargetUrl()); 449 uw.setMethod("GET"); 450 uw.setFrom(Constants.FIRST_URL_HASH); 451 URLMap map = new URLMap(); 452 map.addSourceUrl(uw, Constants.FIRST_URL_HASH); 453 HTMLDocumentBuilder builder = new HTMLDocumentBuilder(map, UrlEncoderFactory.getServletUrlEncoder(request, response)); 454 455 ConfigureBean configBean = cBean.getConfigurationBean(); 457 458 String ssl = configBean.getEnableSSL(); 460 if (ssl == null) { 461 org.jahia.clipbuilder.html.web.RegisterSSLProctocol.unregisterSSLProtocol(); 462 } 463 else { 464 org.jahia.clipbuilder.html.web.RegisterSSLProctocol.registerSSLProtocol(); 465 } 466 467 int browserJavascriptEvent = Integer.parseInt(configBean.getBrowserJavascriptEvent()); 469 int browserJavascriptCode = Integer.parseInt(configBean.getBrowserJavascriptCode()); 470 471 int clientType = Integer.parseInt(configBean.getClient()); 473 int parserType = Integer.parseInt(configBean.getHtmlDocument()); 474 475 String javascript = configBean.getEnableJavascript(); 477 boolean javascriptBool = true; 478 if (javascript == null) { 479 javascriptBool = false; 480 } 481 482 String css = configBean.getEnableCSS(); 484 boolean cssBool = true; 485 if (css == null) { 486 cssBool = false; 487 } 488 489 org.org.apache.commons.httpclient.Header[] headers = new org.org.apache.commons.httpclient.Header[1]; 491 headers = null; 492 String encodingValue = response.getCharacterEncoding(); 493 494 logger.debug("[ Encoding is " + encodingValue + " ]"); 495 497 builder.configure(clientType, parserType, browserJavascriptEvent, browserJavascriptCode, javascriptBool, cssBool, headers); 499 500 SessionManager.setHTMLDocumentBuilder(request, builder); 501 } 502 503 504 505 510 private void executeWhithJavascript() throws Exception { 511 ClipperBean cBean = getClipperBean(); 513 List urlListBean = cBean.getUrlListBean(); 514 HTMLDocument doc = null; 515 UrlBean uBean = (UrlBean) urlListBean.get(urlPosition); 516 logger.debug("[WebBrowserSimulator] Current url: " + uBean.getAbsoluteUrlValue()); 519 520 doc = updateUrlBeanAndGetDocument(getRequest(), getResponse(), uBean); 522 uBean.setDocument(doc); 523 524 if (urlPosition == urlListBean.size()) { 525 setFinished(true); 526 } 527 else { 528 urlPosition++; 529 } 530 setFinalDocument(doc); 532 533 } 534 535 536 543 private String simulateUserInteraction(String html, UrlBean uBean) { 544 logger.debug(" body tag found"); 545 ClipperBean cBean = uBean.getClipperBean(); 546 UrlBean nextBean = cBean.getNextRecordedUrlBean(uBean); 547 String clickOnload = ""; 548 549 if (nextBean != null) { 551 String from = nextBean.getFrom(); 552 String fromHash = nextBean.getHash(); 553 if (from.equalsIgnoreCase(WebConstants.FROM_LINK)) { 555 clickOnload = "document.getElementById('" + fromHash + "').click();"; 557 } 558 else { 559 FormParamBean fBean = uBean.getSubmittedParamBean(fromHash); 561 if (fBean != null) { 562 String name = fBean.getName(); 563 String formParentName = fBean.getFormParentName(); 564 String formParentId = fBean.getFormParentId(); 565 if (formParentName == null || formParentName.equalsIgnoreCase("")) { 566 clickOnload = "document.getElementById('" + formParentId + "')" + "." + name + ".click();"; 567 } 568 else { 569 clickOnload = "document." + formParentName + "." + name + ".click();"; 570 } 571 } 572 else { 573 logger.warn("submit button not found"); 574 String submittedFormName = HashUtilities.getFormNameFromHash(fromHash); 576 if (submittedFormName != null) { 577 clickOnload = "document." + submittedFormName + ".submit();"; 578 } 579 else { 580 String submittedFormId = HashUtilities.getFormIdFromHash(fromHash); 581 clickOnload = "document.getElementById('" + submittedFormId + "')" + ".submit();"; 582 } 583 584 } 585 } 586 587 try { 589 String charSet = WebConstants.ENCODING_ISO; 590 Parser parser = Parser.createParser(html, charSet); 591 NodeIterator it = parser.elements(); 592 Html htmlTag = null; 593 while (it.hasMoreNodes()) { 594 Node n = it.nextNode(); 595 if (n instanceof Html) { 596 htmlTag = (Html) n; 597 NodeIterator itt = parser.elements(); 598 while (itt.hasMoreNodes()) { 599 Node nn = it.nextNode(); 600 if (nn instanceof BodyTag) { 601 Tag tag = (BodyTag) nn; 602 String onload = tag.getAttribute("onload"); 603 if (onload == null) { 604 onload = clickOnload; 605 } 606 else { 607 onload = onload + ";" + clickOnload; 608 } 609 tag.setAttribute("onload", onload); 610 logger.debug("[New Onload: " + onload + " ]"); 612 613 } 614 615 } 616 } 617 618 } 619 return htmlTag.toHtml(); 620 } 621 catch (Exception ex) { 622 ex.printStackTrace(); 623 return "Excepton has occured when setting on load!!"; 624 } 625 626 } 627 628 return "No document"; 629 } 630 631 632 641 private HTMLDocument updateUrlBeanAndGetDocument(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, UrlBean uBean) throws Exception { 642 644 String hash = uBean.getHash(); 646 logger.debug("looking for urlwrapper whit hash: " + hash); 647 648 URLMap map = getURLMap(httpServletRequest); 650 URLWrapper uw = map.getSourceUrl(uBean.getHash()); 651 652 String from = uBean.getFrom(); 654 String httpMethod = ""; 655 String relativeUrl = ""; 657 658 if (uw == null) { 659 logger.debug("URLWrapper not found: it must be the first step"); 660 map.debug_EnumerateKey(); 661 662 httpMethod = "GET"; 664 relativeUrl = uBean.getRelativeUrlValue(); 666 } 667 else { 668 httpMethod = uw.getMethod(); 670 relativeUrl = uw.getSourceUrl(); 671 672 689 } 690 691 696 logger.debug("[ URL is: " + relativeUrl + " ]"); 697 logger.debug("WebBrowser: from: " + from); 698 logger.debug("WebBrowse: hash: " + hash); 699 logger.debug("WebBrowser: method: " + httpMethod); 700 701 Hashtable headerParamHash = getHeaderParams(); 703 HTMLDocument htmlDocument = buildHTMLDocument(httpServletRequest, httpServletResponse, uBean, httpMethod); 704 705 uBean.setDocument(htmlDocument); 706 707 map.reset(); 709 return htmlDocument; 710 } 711 712 713 723 private HTMLDocument buildHTMLDocument(HttpServletRequest request, HttpServletResponse response, UrlBean uBean, String httpMethod) throws Exception { 724 725 HTMLDocumentBuilder builder = SessionManager.getHTMLDocumentBuilder(request); 727 if (builder == null) { 728 builder = new HTMLDocumentBuilder(uBean, httpMethod, UrlEncoderFactory.getServletUrlEncoder(request, response)); 729 730 ConfigureBean configBean = SessionManager.getClipperBean(request).getConfigurationBean(); 732 733 String ssl = configBean.getEnableSSL(); 735 if (ssl == null) { 736 org.jahia.clipbuilder.html.web.RegisterSSLProctocol.unregisterSSLProtocol(); 737 } 738 else { 739 org.jahia.clipbuilder.html.web.RegisterSSLProctocol.registerSSLProtocol(); 740 } 741 742 int browserJavascriptEvent = Integer.parseInt(configBean.getBrowserJavascriptEvent()); 744 int browserJavascriptCode = Integer.parseInt(configBean.getBrowserJavascriptCode()); 745 746 int clientType = Integer.parseInt(configBean.getClient()); 748 int parserType = Integer.parseInt(configBean.getHtmlDocument()); 749 750 String javascript = configBean.getEnableJavascript(); 752 boolean javascriptBool = true; 753 if (javascript == null) { 754 javascriptBool = false; 755 } 756 757 String css = configBean.getEnableCSS(); 759 boolean cssBool = true; 760 if (css == null) { 761 cssBool = false; 762 } 763 764 org.org.apache.commons.httpclient.Header[] headers = new org.org.apache.commons.httpclient.Header[1]; 766 headers = null; 767 String encodingValue = response.getCharacterEncoding(); 768 769 logger.debug("[ Encoding is " + encodingValue + " ]"); 770 772 builder.configure(clientType, parserType, browserJavascriptEvent, browserJavascriptCode, javascriptBool, cssBool, headers); 774 } 775 else { 776 builder.setHttpMethod(httpMethod); 777 builder.setUBean(uBean); 778 } 779 HTMLDocument doc = builder.execute(request, response); 781 782 SessionManager.setHTMLDocumentBuilder(request, builder); 784 return doc; 785 } 786 787 } 788 | Popular Tags |